Em Cargo Shuffle conheceste a pilha de dados do Factor e as palavras de baralhar que a reorganizam. Este exercício parte daí: vais definir palavras que calculam com os valores de entrada, em vez de apenas os mover de um lado para o outro.
Um ! inicia um comentário de linha: o Factor ignora tudo desde o ! até ao fim da linha. Os exemplos abaixo usam o ! tanto para anotar o que o código faz como para mostrar o que ele imprimiria.
Uma palavra é o nome que o Factor dá a uma função. Chamar uma palavra retira alguns valores do topo da pilha e coloca outros no seu lugar. O . retira o valor do topo e imprime-o; as palavras de aritmética inteira +, - e * retiram dois números e colocam o resultado na pilha:
2 3 + . ! prints 5
8 3 - . ! prints 5 (8 - 3, not 3 - 8)
2 3 * . ! prints 6
Uma palavra relacionada, .s, imprime toda a pilha de dados sem consumir nada, o que dá jeito no listener (o prompt interativo do Factor, onde escreves código e vês os resultados) para veres o que um fragmento deixa para trás. É por isso que, mais à frente, alguns exemplos acabam em .s em vez de .: deixam mais do que um valor na pilha, e o .s mostra-os todos.
As palavras aritméticas vivem no vocabulário math, por isso um ficheiro que as use precisa de math na sua linha USING:.
Todas as palavras são documentadas com um efeito de pilha da forma ( inputs -- outputs ). É o contrato da palavra: retira os valores de entrada do topo da pilha e deixa os valores de saída no lugar deles. Os nomes lá dentro servem apenas para te ajudar a lê-lo. O Factor não os usa: só acompanha a ordem em que os valores estão na pilha.
! + is specified as ( x y -- sum )
! . is specified as ( x -- )
O topo da pilha é o valor de entrada mais à direita. Assim, em 8 3 - o 3 está no topo, o efeito de pilha é ( x y -- difference ) e o resultado é 8 - 3.
Um ? no fim das saídas é a convenção para indicar um boolean, mas o exercício lasagna só usa números.
Uma palavra de baralhar do Cargo Shuffle aparece mais abaixo: swap ( x y -- y x ), que troca os dois valores do topo quando estão na ordem errada para a palavra seguinte.
O : inicia a definição de uma palavra, a seguir vem o efeito de pilha, depois o corpo, e o ; termina-a.
: square ( x -- x^2 ) dup * ;
4 square . ! => 16
O compilador do Factor verifica se o corpo corresponde mesmo ao efeito de pilha declarado: uma palavra que afirme ( x -- y ) mas deixe zero ou dois valores na pilha não compila.
O CONSTANT: define um nome para um valor fixo. Uma constante é ela própria uma palavra: ao chamá-la, o valor é colocado na pilha:
CONSTANT: pi 3
pi pi * . ! => 9
O CONSTANT: é sintaxe base e não precisa de uma linha USING:. Coloca as constantes no topo do ficheiro, antes de qualquer palavra que as use.
O corpo de uma palavra pode chamar qualquer palavra que já esteja no âmbito, incluindo as que definiste antes no mesmo ficheiro:
: double ( x -- 2x ) 2 * ;
: quadruple ( x -- 4x ) double double ;
5 quadruple . ! => 20
É assim que a última tarefa do exercício reutiliza uma anterior.
Tanto as palavras como as constantes usam lowercase-kebab-case: letras minúsculas unidas por hífenes (por exemplo, expected-bake-time, preparation-time).
Neste exercício vais escrever algum código para te ajudar a cozinhar uma lasanha espetacular a partir do teu livro de receitas favorito.
Tens quatro tarefas, todas relacionadas com o tempo gasto a cozinhar a lasanha.
Define a constante expected-bake-time, que deve devolver quantos
minutos a lasanha tem de cozer no forno.
De acordo com o livro de receitas, a lasanha tem de estar no forno durante um total de 40 minutos.
expected-bake-time .
! => 40
Define a palavra preparation-time. Retira da pilha o número de camadas
que adicionaste à lasanha e deixa lá quantos minutos passaste a
prepará-la, partindo do princípio de que cada camada leva 2 minutos a
preparar.
4 preparation-time .
! => 8
Define a palavra remaining-time. Recebe o número de minutos que a
lasanha já passou no forno e deixa lá quantos minutos ainda tem de lá
ficar.
25 remaining-time .
! => 15
Define a palavra total-working-time. Retira dois argumentos da pilha
(primeiro o número de camadas da lasanha, depois o número de minutos que
a lasanha já esteve no forno) e deixa lá o tempo total gasto a cozinhar
até agora: o tempo de preparação mais o tempo que já esteve no forno.
3 20 total-working-time .
! => 26
Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.