Funções



Funções devem ser declaradas antes de ser usadas, portanto devem ser escritas no topo do seu programa. Entretando isso não é necessário se uma função é chamada por outra função.


native! func

Variáveis criadas dentro de uma função criada com func são globais. Elas são vistas por todo o programa.

Uma função é criada com func da seguinte forma:

<function name>: func [<argument1> <argument2> ... <argument n>] [ <actions performed on arguments>]

Red []

mysum: func [a b] [a + b]

print mysum 3 4


7


Demonstrando que as variáveis são globais:

Red []

mysum: func [a b] [

       mynumber: a + b

       print mynumber

]

mynumber: 20

mysum 3 4

print mynumber


7

7


native! function

function faz as suas variaveis locais, ou seja, "esconde" as variáveis dentro da função do resto do programa.

Repetindo o programa assima, mas usando function ao invés de func:

Red []

mysum: function [a b] [

       mynumber: a + b

       print mynumber

]

mynumber: 20

mysum 3 4

print mynumber


Resultados diferentes:

7

20

Forçando as variáveis a serem globais, com o refinamento /extern:

Red []

myfunc: function [/extern a b] [

       a: 22

       b: 33

]

a: 7

b: 9

myfunc

print a

print b


22

33

Definindo o tipo de argumento:

Você pode forçar os argumentos a serem de um determinado tipo de datatype:

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


Você pode permitir vários  datatypes:

Red []

mysum: function [a [integer! float!] b[integer!]] [print a + b]

print mysum 3.2 4


7.2



Ou usar uma classe superior de datatypes:

Red []

mysum: function [a [number!] b[number!]] [print a + b]

print mysum 3.2 4


7.2


Retornando valores de uma função:  native! return  

O valor de retorno de uma função pode ser ou o último valor avaliado por ela ou um determnado explicitamente pela palavra  return:

Exemplo com o último valor avaliado:

Red []

myfunc: function [] [

       8 + 9

       3 + 3

       print "got here"        ; isso é executado

       10 + 5                ; isso é retornado

]

print myfunc


got here

15


Exemplo com return :

Red []

myfunc: function [] [

       8 + 9

       return 3 + 3                        ; this is returned

       print "never got here"        ; NOT executed

       10 + 5                                

]

print myfunc


6

Criando seus próprios refinamentos:

Você pode criar refinamentos para suas funções, como os refinamentos nativos do Red: <minhfunção>/<meurefinamento>. Os refinamentos são valores booleanos (true ou false) que são checados pela função:

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


Note que argumentos não são obrigatórios para refinamentos.

Atribuindo funções para palavras (variáveis)

Para atribuir uma função a uma palavra (variável) você deve preceder a função com dois pontos: <palavra>: :<função>

>> mysum: func [a b] [a + b]

== func [a b][a + b]

>> a: :mysum

== func [a b][a + b]

>> a 3 9

== 12


native! does

Se a sua função não precisa de argumentos ou variáveis locais, use a palavra  does para criá-la:

Red []

greeting: does [

       print "Hello"

       print "Stranger"

]


greeting


Hello

Stranger


native! has

Se a sua função não usa argumentos, mas tem variáveis locais, use a palavra has para criá-la.  has transforma o argumento em uma variável local. Compare os três programas abaixo. O primeiro usa has sem argumento, portanto "number" é uma variável global. O segundo dá a "number" um argumento, fazendo-o local. E o terceiro mostra que uma função com argumento precisa que o argumento seja enviado pelo evento de chamada:

  


native! exit

Sai da função sem retornar nenhum número.