ReasonML: Escopos e bindings com let

Criando variáveis e blocos em ReasonML

Esse artigo faz parte da série “O que é ReasonML?”.

1. binding normal com let

As variáveis são definidas da seguinte forma:

# let x = 123;
let x: int = 123;
# x;
- : int = 123

Cada binding (pares de variáveis-valores) que é criada dessa maneira é imutável — você não pode atribuir um valor diferente à variável. A norma é que o valor também seja imutável, mas não precisa ser.

Dado que o binding é imutável, é lógico que você tem que inicializar imediatamente a variável. Você não pode deixá-la não inicializada.

2. Redefinindo variáveis

O ReasonML não impede a redefinição de variáveis:

# let x = 1;
let x: int = 1;
# x;
- : int = 1
# let x = 2;
let x: int = 2;
# x;
- : int = 2

Isso não está em conflito com a imutabilidade dos bindings: é mais parecido como sombrear (shadowing) de variáveis em ambientes aninhados do que com o alterar do valor de uma variável.

Ser capaz de redefinir variáveis é especialmente útil em linhas de comando interativas.

3. Anotações de tipagem

Você também pode anotar a variável com um tipo:

# let y: string = "abc";
let y: string = "abc";

Declarar tipos é ocasionalmente necessário com tipos mais complicados, mas redundante com tipos simples.

4. Criando novos escopos através de blocos de escopo

O escopo de uma variável é a construção sintática em que ela existe. Os blocos permitem que você apresente novos escopos. Eles começam e terminam com chaves franzidas ({}):

let x = "hello";
print_string(x); /* hello */
{ /* A */
let x = "tmp";
print_string(x); /* tmp */
}; /* B */
print_string(x); /* hello */

O bloco começa na linha A e termina na linha B.

O interior de um bloco tem a mesma estrutura que o nível superior de um arquivo: é uma seqüência de expressões que são separadas por ponto e vírgula.

Por que há um ponto-e-vírgula após o fechamento na linha B? Um bloco é apenas outra expressão. Seu valor é o valor da última expressão dentro dele. Isso significa que você pode colocar blocos de código onde quer que você possa colocar expressões:

let x = { print_string("hi"); 123 }; /* hi */
print_int(x); /* 123 */

Outro exemplo:

print_string({
let s = "ma";
s ++ s;
}); /* mama */

Isso continua um tema comum no ReasonML: a maioria das coisas são expressões.

Créditos

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store