Notas sobre sintaxe
- Letras maiúsculas ou minúsculas são indiferentes para o Red, mas existem algumas exceções, a mais relevante é que um programa precisa começar com Red (não REd nem red).
- Caracteres de nova linha new-line são ignorados pelo Red, uma exceção é um new-line dentro de uma string.
Nota da tradução: Não consegui encontrar em português uma palavra que traduzisse o exato sentido de "evaluate" no contexto do processamento de dados como é feito pelo Red: não só com números mas com palavras e rotinas. Assim vou usar a palavra "computação", que não me parece perfeita mas...
- Red é uma linguagem funcional, significando que ela avalia, ou computa (evaluates) resultados. A ordem desta computação (ordem de execução das funções) não é usual e é bom você dar uma olhada no capítulo Ordem de computação.
(os próximos tópicos podem não ser exatos, mas até agora explicam o funcionamento do Red satisfatoriamente)
- um script de Red é uma longa cadeia de "palavras" ("words"). Estas palavras podem estar associadas a dados ou ações.
- "palavras" são separadas por um ou mais espaços em branco.
- o Red mantém um dicionário com as palavras pré-definidas e as palavras criadas pelo usuário.
- "palavras" podem ser agrupadas em "blocos" delimitados por colchetes ("[" e "]"). Blocos não são necessariamente rotinas, são só grupos de "palavras" que podem ou não ser "avaliados" por uma ação.
- todos os dados do programa estão dentro do próprio programa. Se são acrescentados dados externos, estes são adicionados à lista de "palavras" do programa.
- toda palavra tem que ter um valor quando avaliada. Este valor pode vir:
- da computação, se a palavra for associada a uma ação;
- da própria palavra, quando esta for associada a um dado;
- de outra palavra ou bloco. Isto é feito com o símbolo de atribuição, que é dois-pontos (":"), seguido pela palavra ou bloco que se quer associar (por exemplo: meuQuarto: 33).
- Me parece que em Red, você pode dizer que a variável é atribuida aos dados, e não o contrário. Na verdade, não existem "variáveis" em Red, só palavras que são associadas a dados.
- Copiar palavras (variáveis) em Red requer muito cuidado. Quando você quiser fazer uma cópia realmente independente de uma palavra (variável), você deve usar a palavra pré-definida (comando) copy . Veja o capítulo Copiando.
- Assim como "copiar", "limpar" uma série (note que todas as strings são séries) também requer cuidado. Simplesmente atribuir "" (string vazio) o zero à série pode não produzir os resultados esperados. A lógica interna do Red faz com que ele pareça "lembrar" de coisas de uma forma inesperada. Então, para limpar uma série, você deve usar a palavra pré-definida clear.
- Toda palavra tem um datatype. Red tem um número notavelmente grande de datatypes. Eles estão listados no capítulo Datatypes . O nome de um datatype é sempre seguido por um ponto de exclamação.
- Quando uma palavra é criada pela primeira vez, ela tem o datatype word! que é usado assim:
Notação |
Significado |
palavra |
Obtém o valor natural da palavra. (se o valor for uma função, avalia a função, senão, retorna o valor). |
palavra: |
Associa o valor da palavra (como atribuição) a um valor. |
:palavra |
Obtém o valor da palavra sem computar o resultado (Útil par obter o valor de uma função) |
'palavra |
Trata a palavra como um valor em si própria (um símbolo). Não avalia o seu valor. |
/palavra |
Trata a palavra como um refinamento. Usado para argumentos opcionais. |
Uma visão um tanto simplificada do fluxo do Red:
Nota: A função que obtém dados anteriores a ela (a terceira da direita para a esquerda) represnta um operador infixo, como "+", "-" , "*" , "/" etc.
Refinamentos
Muitas ações em Red admitem "refinamentos". Um refinamento é declarado adicionando "/<refinamento>" ao comando (palavra pré-definida) e modifica seu funcionamento.
Comentando o código:
Todo o texto depois de um ponto-e-vírgula (;) em uma linha é ignorado pelo interpretador. Também existe a função interna comment . Um grupo de words após comment também será ignorado pelo interpretador. Esse grupo de palavras deve estar dentro de " ", { } ou [ ] .
Eu também notei que qualquer texto escrito no código-fonte antes do "prólogo" do Red ( Red [ ... ] ), no início, também é ignorado pelo interpretador, mas não tenho certeza se essa é uma maneira segura de adicionar informação ao código.
Exemplos de comentários:
Me parece que qualquer coisa escrita aqui, antes do código,
é ignorada.
Red [ ; Aqui começa o prólogo
Author: "Ungaretti" ; você pode adicionar comentários depois de ";"
Date: "september 2018" ; mas apenas na mesma linha.
Purpose: "to show how to comment the code"
]
; Um prólogo deve ser informativo
comment [ Este é um comentário multi-linhas
usando o colchetes.]
print "End of first comment."
comment " This is a comment." ; se você usa aspas o comentário
; é limitado a uma linha
print "End of second comment."
comment { Essa me parece a melhor maneira
de fazer comentários multi-linhas: usando
comment e chaves}
print "End of third comment."
{estranhamente, o interpretador parece ignorar texto
dentro de chaves, mesmo sem o uso do comando "comment".
Me parece bem elegante, mas cuidado, não vi nada na
documentação sobre isso}
print "End of the fourth, strange, comment."
End of first comment.
End of second comment.
End of third comment.
End of the fourth, strange, comment.