Skip to content

Latest commit

 

History

History
82 lines (56 loc) · 2.01 KB

routine.adoc

File metadata and controls

82 lines (56 loc) · 2.01 KB

Datový typ routine!

1. Úvodem

Hodnotou typu routine! je nativní funkce (func) z oboru Red/System, která se volá v programu Red.

Specifikace přijímá jako argumenty a vratné hodnoty datové typy Redu, jež automaticky při volání konvertuje na příslušné typy soustavy Red/System.

Dokumentaci pro Red/System lze nalézti zde: https://static.red-lang.org/red-system-specs.html

Typ routine! je člen typesetů default! a any-function!

2. Vytvoření

Hodnoty typu routine! lze vytvořit s použitím vestavěné funkce routine.

3. Literálová skladba

<routine> ::= routine <routine-spec> <routine-body>
<routine-spec> ::= [<docstring>° <routine-argument>* <locals>° <routine-return>°]
<routine-argument> ::= <word> <argument doc>° | <word> [<type-literal>] <argument-doc>°
<locals> ::= /local <routine-argument>*
<routine-return> ::= return: [<type-literal>]
<type-literal> ::= any-type! | <type-name>
<routine-body> ::= <block>

4. Vytvoření při runtime

Hodnoty routine! nejsou pro interpreter povoleny. Musejí být uvedeny typem set-word a následně kompilovány.

Red []

increment: routine [
    n       [integer!]
    return: [integer!]
][
    n + 1
]

Argumenty rutin jsou vymezeny jediným slovem typu any-type!, integer!, float! a logic! nebo aliasem struct! ze soustavy Red/System, definovaným zde: https://github.com/red/red/blob/master/runtime/datatypes/structures.reds.

Datové typy integer!, float! a logic! se na ekvivalent soustavy Red/System nepřekládají.

Příklad

block! je přeložen na ekvivalent soustavy Red/System:

red-block!: alias struct! [
	header 	[integer!]
    head    [integer!]
	node    [node!]
	extra   [integer!]
]

5. Testování hodnot

K ověření, zda hodnota je typu routine, použijeme funkce routine?.

routine? :increment
== false

Datový typ zadané hodnoty získáme dotazem type?.

type? :increment
== unset!

6. Předdefinovaná slova

routine, routine?