No último artigo vimos três abordagens para fazer reiteração em Moonscript. Neste artigos nos apronfundaremos na persistência de estado entre passos do reiterador padrão, que eu citei como sendo uma dificuldade, porém nem tanto.
Vocês vão se recordar que eu disse que o reiterador padrão era representado pelo gerador, condição de parada ou estado e valor inicial, enquanto o gerador recebe como parâmetros o estado ou condição de parada e o resultado da reiteração anterior.
No exemplo, Conjectura de Collatz, usamos uma condição de parada. Neste artigo daremos um exemplo com estado.
Vamos fazer a Sequência de Fibonacci usando o reiterador padrão. Pra isso manteremos os valores de a
e
b
em uma tabela de estado, bem como a contagem n
.
A função a ser passada para o for
é:
(n) -> _fib, {a: 0, b: 1, :n}
Que inicia o estado com os valores de a
, b
e n
, e ignora o valor inicial, atribuindo-lhe nil
.
A função de passo (_fib
) deve atualizar os valores de a
e b
, e decrementar o valor de n
, retornando a
. Não
será preciso lidar com o resultado anterior (que ignoramos em
_fib
), já que temos todos os dados no estado:
_fib = =>
if @n > 0
@a, @b, @n = @b, @a+@b, @n-1
@a
Veja que tiramos proveito da sintaxe de fat arrow de Moonscript, que trata self
como @
.
E este foi um exemplo bem simples de como usar estado no reiterador padrão de Lua.