Hodnotami typu function!
jsou uživatelsky definované funkce.
Typ function!
je členem typesetů any-function!
a default!
Uživatelské funkce se vytvářejí za běhu programu pomocí make
nebo s použitím func
, has
, does
či function
.
-
Skladba BNF:
<function> ::= make function! [<function-spec> <function-body>] | func <function-spec> <function-body> | has [<argument>*] <function-body> | does <function-body> | function <function-spec> <function-body> <function-spec> ::= [<docstring>° <argument-spec> <return-spec>°] <docstring> ::= <string> <argument-spec> ::= <argument>* <optional-arguments>* <argument> ::= <argument-name> <argument-doc>° | <argument-name> [<typeset-element>*] <argument-doc>° <argument-name> ::= <word-literal> | '<word-literal> | :<word-literal> <argument-doc> ::= <string> <optional-arguments> ::= <function-refinement> <argument-doc>° <argument>* <function-refinement> ::= /<word-literal> <return-spec> ::= return: [<typeset-element>*] <return-doc>° <return-doc> ::= <string> <function-body> ::= <block>
Příklady
-
Make
>> double: make function! [[n [number!]] [n * 2]] == func [n [number!]][n * 2]
-
Func je ekvivalentní k
make function!
.>> double: func [n [number!]][n * 2] == func [n [number!]][n * 2]
Slova za volitelným upřesněním (refinement)
/local
budou považována za lokální pro tělo funkce. -
Has je ekvivalentní k
func
s upřeněním/local
.>> fourty-two: has [value][value: 42 print value] == func [/local value][value: 42 print value]
-
Does je ekvivalentní k
func
bez argumentů.>> h: does [print "Hi"] == func [][print "Hi"]
-
Function je ekvivalentní k
func
avšak všechny hodnoty typuset-word!
a slovaforeach
,remove-each
arepeat
budou považována za lokální v těle funkce.>> double: function [n [number!]][val: "Result is" print [val n * 2]] == func [n [number!] /local val][val: "Result is" print [val n * 2]] >> double 9 Result is 18
Slovo
val
zůstává pro funkci lokální a není dostupné ze základního kontextusystem/words
.>> val *** Script Error: val has no value *** Where: catch *** Stack:
Slova za volitelným upřesněním
/extern
jsou dostupná ze základního kontextusystem/words
.>> double: function [n [number!] /extern val][val: "Result is" print [val n * 2] == func [n [number!]][val: "Result is" print [val n * 2]] >> double 9 Result is 18 >> val == "Result is"
Hodnoty funkce lze porovnávat z hlediska stejnosti a rovnosti pomocí dotazů same?
, ==
, equal?
, strict-equal?
, not-equal?
, <>
.
K ověření zda zda posuzovaná hodnota je typu function!
použijeme dotaz function?
.
>> function? :double
== true
Typ hodnoty zjistíme dotazem type?
.
>> type? :double
== function!