Uso do parse - Validando inputs
Validando entradas alfanuméricas:
Antes de prosseguir, devo avisá-lo que o datatyping do Red pode causar alguns problemas à programação. Por exemplo, um número de um único dígito em Red pode ser um integer!, um string!, um char! , ou qualquer outra coisa. Portanto, se você tiver alguns erros inexplicáveis em seu script, verifique se os datatypes são compatíveis.
Esse é um script que solicita ao usuário que digite 4 números de um dígito e verifica se a entrada está OK até que a entrada seja "q":
Red []
entry: ""
while [entry <> "q"] [
entry: ask "Enter four digits in the 1-8 range: "
either (parse entry [some ["1" | "2" | "3" | "4" | "5" | "6" | "7" | "8"]]) and ((length? entry) = 4) [
print "OK"]
[
print "Not OK!"
]
]
Isso funciona, mas ["1" | "2" | "3" | "4" | "5" | "6" | "7" | "8"] pode ser substituido por charset ["12345678"]:
Red []
entry: ""
validchar: charset ["12345678"]
while [entry <> "q"] [
entry: ask "Enter four digits in the 1-8 range: "
either (parse entry [some validchar]) and ((length? entry) = 4) [
print "OK"]
[
print "Not OK!"
]
]
Como o parse verifica caracter por caracter, charset ["12345678"] também pode ser escrito como charset [#"1" - #"8"] ! Red entende que essa é uma seqüência de caracteres. Assim, seu programa pode aceitar qualquer caractere ASCII numérico e minúsculo usando charset [#"0" - #"9" #"a" - #"z"].
Simples validador de número de telefone (do manual da Rebol / Core) - Regras referindo-se a outras regras:
Red []
digits: charset "0123456789"
area-code: ["(" 3 digits ")"]
phone-num: [3 digits "-" 4 digits]
print parse "(707)467-8000" [[area-code | none] phone-num]
true
Simples validador de e-mail (do blog do Red):
Red []
digit: charset "0123456789"
letters: charset [#"a" - #"z" #"A" - #"Z"]
special: charset "-"
chars: union union letters special digit
word: [some chars]
host: [word]
domain: [word some [dot word]]
email: [host "@" domain]
print parse "john@doe.com" email
print parse "n00b@lost.island.org" email
print parse "h4x0r-l33t@domain.net" email
true
true
true
Validando expressões matemáticas escritas como texto (do manual do Rebol/Core):
Observe que este exemplo usa regras recursivas (uma regra que se refere a si mesma).
Red []
expr: [term ["+" | "-"] expr | term]
term: [factor ["*" | "/"] term | factor]
factor: [primary "**" factor | primary]
primary: [some digit | "(" expr ")"]
digit: charset "0123456789"
print parse "1+2*(3-2)/4" expr ; vai retornar true
print parse "1-(3/)+2" expr ; vai retornar false
true
false