Funkce
Funkce musejí být před použitím deklarovány a proto se píší v přední části programu. To ale není požadováno, je-li funkce volána z jiné funkce.
native! func
Skladba funkce s func je tato:
<název>: func [<arg1> <arg2> ... <arg n>] [ <actions performed on arguments>]
Red []
mysum: func [a b] [a + b]
print mysum 3 4
7
Proměnné uvnitř funkce, vytvořené se slovem func, jsou globální. Jsou viditelné z celého programu.:
Red []
mysum: func [a b] [
mynumber: a + b
print mynumber
]
mynumber: 20
mysum 3 4
print mynumber
7
7
native! function
Proměnné uvnitř funkce se slovem function jsou lokální, to jest, jsou přístupné pouze uvnitř definované funkce.
Red []
mysum: function [a b] [
mynumber: a + b
print mynumber
]
mynumber: 20
mysum 3 4
print mynumber
Různé výsledky:
7
20
Vnucená globální přístupnost proměnných upřesněním /extern:
Red []
myfunc: function [/extern a b] [
a: 22
b: 33
]
a: 7
b: 9
myfunc
print a
print b
22
33
Definice typu argumentu:
Datový typ (datatype) argumentu lze předem určit :
Red []
mysum: function [a [integer!] b[integer!]] [print a + b]
print mysum 3.2 4 ; oops! 3.2 is a float!
*** Script Error: mysum does not allow float! for its a argument
*** Where: mysum
*** Stack: mysum
Lze připustit více datových typů:
Red []
mysum: function [a [integer! float!] b[integer!]] [print a + b]
print mysum 3.2 4
7.2
Případně lze zadat nadřízený datový typ:
Red []
mysum: function [a [number!] b[number!]] [print a + b]
print mysum 3.2 4
7.2
Vratná hodnota funkce: native! return
Vratnou (return) hodnotou funkce je buď poslední funkcí vyhodnocená hodnota nebo hodnota explicitně určená slovem return:
Red []
myfunc: function [] [
8 + 9
3 + 3
print "got here" ; this executes
10 + 5 ; this is returned
]
print myfunc
got here
15
Příklad s 'return'; slovo return je poslední aktivní příkaz funkce:
Red []
myfunc: function [] [
8 + 9
return 3 + 3 ; this is returned
print "never got here" ; NOT executed
10 + 5
]
print myfunc
6
Vytváření vlastních upřesnění:
Je možné vytvářet vlastní upřesnění funkcí, podobná nativním upřesněním Redu: Jednotlivá upřesnění jsou bulíny (boolean values), ověřované funkcí:
Red []
myfunc: function [a /up b /down c] [
if up [print a + b]
if down [print a - c]
]
myfunc/up 10 3
myfunc/down 10 3
13
7
Pro upřesnění nejsou argumenty povinné.
Přiřazení funkcí ke slovům (variables)
To assign a function to a variable (a word) you must precede the function with a colon: <word>: :<function>
>> mysum: func [a b] [a + b]
== func [a b][a + b]
>> a: :mysum
== func [a b][a + b]
>> a 3 9
== 12
native! does
Pokud naše rutina jenom něco provádí - bez argumentů a lokálních proměnných, použijeme slovo does :
Red []
greeting: does [
print "Hello"
print "Stranger"
]
greeting
Hello
Stranger
native! has
Pokud naše rutina nepoužívá žádné externí argumenty ale má lokální proměnné, použijeme slovo has. To přemění případný argument na lokální proměnnou. Porovnejte níže uvedené tři programy. První používá has bez argumentu, slovo number je tedy globální proměnná. Druhá obsahuje number jako argument, jenž je však uvnitř funkce redefinovaný na lokální proměnnou. Pokud změníme název tohoto argumentu, je funkcí ignorován, neboť argument není u tohoto typu funkce povinný. V třetí ukázce vidíme, že v definici funkce musí být argument reálně použit, nikoliv redefinován a že funkce musí být volána s hodnotou argumentu.
native! exit
Opustí funkci bez vracení jakékoli hodnoty.
Různé typy vestavěných funkcí
- mezaninové funkce jsou vytvořeny v jazyce Red a jejich zdrojový kód lze číst s použitím příkazu source <název fce>.
Výpisy funkcí následujících typů lze získat dotazem (help či ?) na název typu:
- funkce typu function
- funkce typu op!
- funkce typu action!
- funkce typu routine!
- funkce typu native! jsou součástí interpreta a aktivují se na velmi nízké úrovni;