REBOLution

Quando se apresenta uma nova linguagem (apesar de REBOL não ser uma nova linguage no aspecto desenvolvimento já que teve sua primeira versão em 1997) é tendência de muitos é ficar comparando com a sua linguagem preferida. Não faça isso. Essa negócio de “Dãããã, a minha linguagem do coração também faz isso então não vou perder o meu tempo olhando.” é coisa de n00b. Mas…

Como a esmagadora maioria das linguagens, REBOL (Relative Expression Based Object Language) foi influenciada por outras linguagens, no caso por List, Forth, Logo e Self e projetada por Carl Sassenrath (se você não conhece, importante ler um pouco sobre ele). A versão 3 foi liberada recentemente (12/12/12) sob licença aberta (Apache) apesar de ser conhecida desde 2008. É possível utilizar a versão 2 gratuitamente porém ela é proprietária. Pretendo me deter a versão 3 e a expectativa é que possuas as mesmas funcionalidades da versão 2 mais as melhorias. O porte para Android deve ocorrer em um futuro próximo (ou distante, não é possível prever por enquanto).

No momento é necessario clonar o repositório e compilar mas, assim que as coisas estiverem mais estáveis, será possível baixar na página principal da linguagem. Por enquanto é possível baixar a última versão compilada antes da abertura do código.

Por suas influências, a linguagem mistura código e dados de uma forma transparente, é interpretada, reflexiva e, talvez, a parte mais interessante, é a facilidade de criar dialetos (DSLs).

É interessante salientar que a linguagem não faz distinção entre maiúsculas e minúsculas (foreach = FOREACH), o espaço é necessário (1 + 1 = 2 ; 2+3 = erro) e o resto fica por sua conta. Como ainda está em desenvolvimento, a linguagem ainda possui alguns probleminhas e o ambiente integrado (REPL) também. Por exemplo, não é possível digitar expressões em mais de uma linha ou caracteres especiais (UTF-8). Mas você pode criar um script em um processador qualquer e executá-lo sem problemas.

Estando no REPL, se desejarmos maiores informações sobre ‘foreach‘, basta digitar:

>> help foreach
USAGE:
 FOREACH 'word data body
DESCRIPTION:
 Evaluates a block for each value(s) in a series.
 FOREACH is a native value.
ARGUMENTS:
 word -- Word or block of words to set each time (local) (word! block!)
 data -- The series to traverse (series! any-object! map! none!)
 body -- Block to evaluate each time (block!)

Aproveitando, alguns exemplos do foreach (repare a ausência de delimitadores na série):

foreach x [1 2 3 4] [
print x
]
1
2
3
4
bloco: [print x] 
foreach x [1 2 3 4 5] bloco
1
2
3
4
5
Foreach [X Y] [1 2 3 4 6] [Print [x y]]
1 2
3 4
6 none

Nos dias atuais pode nem ser tanta novidade, mas na época, acredito que não existia uma linguagem com tamanha transparência para trabalhar em rede. Para ler um arquivo de um local qualquer bastaria escrever “read http://www.rebol.com” e para executar localmente um script que estivesse em outra máquina bastava “do ftp://servidor/script.r“. Diversas linguagens permitem tarefas semelhantes mas, a grande maioria, necessita de alguma biblioteca externa ou algum include/use.

Outra característica é a grande quantidade de tipos de dados existentes. Nativamente possui string, inteiros, data, hora, monetário, pares, tupla, etc.. Por exemplo 10:30 + 0:40 = 11:10. Isto facilita muitas coisas, principalmente na criação de DSLs.

>> 3x4 + 1
== 4x5
>> 3x4 + 1x2
== 4x6
>> 127.0.0.1 + 0.0.25.1
== 127.0.25.2

A parte para avaliar e trabalhar com expressoes é onde REBOL (por enquanto estou escrevendo tudo em maiúsculas mas já está em discussão se continuará assim ou não) se sai muito bem. Quem conhece expressões regulares vai sentir muita facilidade. Um avaliador simples para verificar a validade de um CPF, onde ele deve conter 3 dígitos, um ponto, 3 dígitos, um ponto, 3 dígitos pode seguir um hifem ou uma barra e mais 2 dígitos pode ser simplesmente resolvido da seguinte forma:

num: charset "0123456789"
regra_cpf: [3 num "." 3 num "." 3 num ["-" | "/"] 2 num]
cpf?: func [cpf] [parse cpf regra_cpf]

>> cpf? "111.222.333-88"
== true
>> cpf? "111.222.333/88"
== true
>> cpf? "111.222.333/8"
== false
>> cpf? "111-222-333/88"
== false

Bem, isso é o basiquinho. É possível, por exemplo, avaliar um texto do tipo:

Venda 2 calculadoras (preço antigo) por R$20
Venda 3 calculadoras (2 pelo preço antigo e 1 pelo preço novo) por R$40

E obter como resposta: Foram vendidas 5 calculadoras por R$60.

Mas fica para a próxima.

Editado: Alguns exemplos em REBOL 2 que coloquei há algum tempo.

Anúncios