Estruturas de controle
native! if
Executa um bloco se o teste for true.
if <test> [ block ]
>> if 10 > 4 [print "large"]
large
native! unless
A mesma coisa que if not. Executa um bloco só se o teste for false.
unless <test> [ block (se teste false) ]
>> unless 10 > 4 [print "large"]
== none
>> unless 4 > 10 [print "large"]
large
native! either
Um novo nome para o clássico if-else. Executa o primeiro bloco se o teste for true ou executa o segundo bloco se o teste for false.
either <test> [true block] [false block]
>> either 10 > 4 [print "bigger"] [print "smaller"]
bigger
>> either 4 > 10 [print "bigger"] [print "smaller"]
smaller
native! switch
Executa o bloco correspondente a um determinado valor:
Red[]
switch 20 [
10 [print "ten"]
20 [print "twenty"]
30 [print "thirty"]
]
twenty
/default
Se o programa não encontrar uma correspondência, executa um bloco default.
Red[]
switch/default 15 [
10 [print "ten"]
20 [print "twenty"]
30 [print "thirty"]
][ print "none of them"] ;default block
none of them
native! case
Faz uma série de testes, executando o bloco correspondente ao primeiro teste que retorna true .
Red[]
case [
10 > 20 [print "not ok!"]
20 > 10 [print "this is it!"]
30 > 10 [print "also ok!"]
]
this is it!
/all
Executa todos os testes que retornam true .
Red[]
case/all [
10 > 20 [print "not ok!"]
20 > 10 [print "this is it!"]
30 > 10 [print "also ok!"]
]
this is it!
also ok!
native! catch & throw
Catch e throw podem ser usados para criar estruturas de controle complexas. Na sua forma mais simples catch recebe o return de um entre vários throws:
Red[]
a: 10
print catch [
if a < 10 [throw "too small"]
if a = 10 [throw "just right"]
if a > 10 [throw "too big"]
]
just right
catch/name
faz o catch de um throw com nome.
throw/name
faz throws de um catch com nome.
Controle Booleano (lógica)
native! all
Avalia todas as expressões em um bloco. Se alguma retorna false, o retorno do all é none, senão retorna o resultado da última computação.
>> john: "boy"
== "boy"
>> alice: "girl"
== "girl"
>> all [john = "boy" alice = "girl" 10 + 3] ;todas verdadeiras, a última computação é retornada.
== 13
>> all [john = "boy" alice = "boy" 10 + 3] ; alice = "boy" é false!
== none
native! any
Avalia cada expressão em um bloco e retorna o primeiro valor que não é false. Se todos os valores forem false retorna none.
>> john: "boy"
== "boy"
>> alice: "girl"
== "girl"
>> any [john = "girl" alice = "girl" 10 + 3] ;alice = "girl" não é falso: retorna !
== true
>> any [john = "girl" 10 + 3 5 > 2] ; 10 + 3 não é falso: retorna!
== 13