Em Cargo Shuffle, você conheceu a pilha de dados do Factor e as palavras de embaralhamento que a reorganizam. Este exercício continua a partir daí: você vai definir palavras que calculam com suas entradas em vez de apenas movê-las de um lado para o outro.
Um ! inicia um comentário de linha: o Factor ignora tudo a partir do ! até o fim da linha. Os exemplos abaixo usam ! tanto para anotar o que o código faz quanto para mostrar o que ele imprimiria.
Uma palavra é o nome que o Factor dá para uma função. Chamar uma palavra remove alguns valores do topo da pilha e empilha alguns valores de volta.
. remove o valor do topo e o imprime; as palavras de aritmética de inteiros +, -, * removem dois números e empilham o resultado:
2 3 + . ! prints 5
8 3 - . ! prints 5 (8 - 3, not 3 - 8)
2 3 * . ! prints 6
Uma palavra relacionada, .s, imprime a pilha de dados inteira sem consumir nada, o que é útil no listener (o prompt interativo do Factor, onde você digita código e vê os resultados) para enxergar o que um trecho deixa para trás. É por isso que os exemplos mais adiante às vezes terminam em .s em vez de .: eles deixam mais de um valor na pilha, e .s mostra todos eles.
As palavras de aritmética vivem no vocabulário math, então um arquivo que as usa precisa de math na sua linha USING:.
Toda palavra é documentada com um efeito de pilha no formato ( inputs -- outputs ). É o contrato da palavra: essa palavra remove as entradas do topo da pilha e deixa as saídas no lugar delas. Os nomes dentro dele servem só para ajudar você a lê-lo. O Factor não os usa: ele só acompanha a ordem em que os valores ficam na pilha.
! + is specified as ( x y -- sum )
! . is specified as ( x -- )
O topo da pilha é a entrada mais à direita. Então 8 3 - tem 3 no topo, o efeito de pilha é ( x y -- difference ) e o resultado é 8 - 3.
Um ? no final das saídas é a convenção para "um Boolean", mas o exercício lasanha usa apenas números.
Uma palavra de embaralhamento do Cargo Shuffle aparece abaixo: swap ( x y -- y x ), que inverte os dois valores do topo quando eles estão na ordem errada para a próxima palavra.
: inicia a definição de uma palavra, o efeito de pilha vem em seguida, depois o corpo e, por fim, ; a encerra.
: square ( x -- x^2 ) dup * ;
4 square . ! => 16
O compilador do Factor verifica se o corpo realmente corresponde ao efeito de pilha declarado: uma palavra que afirma ( x -- y ) mas deixa zero ou dois valores na pilha não vai compilar.
CONSTANT: define um nome para um valor fixo. Uma constante é ela mesma uma palavra: chamá-la empilha o valor na pilha:
CONSTANT: pi 3
pi pi * . ! => 9
CONSTANT: é sintaxe central e não precisa de uma linha USING:. Coloque as constantes no topo do arquivo, antes de qualquer palavra que as use.
O corpo de uma palavra pode chamar qualquer palavra que já esteja no escopo, inclusive as que você definiu antes no mesmo arquivo:
: double ( x -- 2x ) 2 * ;
: quadruple ( x -- 4x ) double double ;
5 quadruple . ! => 20
É assim que a última tarefa do exercício reaproveita uma anterior.
Palavras e constantes usam ambas lowercase-kebab-case: letras minúsculas unidas por hífens (por exemplo, expected-bake-time, preparation-time).
Neste exercício você vai escrever um pouco de código para ajudar a preparar uma lasanha incrível do seu livro de receitas favorito.
Você tem quatro tarefas, todas relacionadas ao tempo gasto no preparo da lasanha.
Defina a constante expected-bake-time, que deve retornar quantos minutos a lasanha precisa ficar no forno.
De acordo com o livro de receitas, a lasanha precisa ficar no forno por um total de 40 minutos.
expected-bake-time .
! => 40
Defina a palavra preparation-time. Ela retira da pilha o número de camadas que você adicionou à lasanha e deixa quantos minutos você gastou preparando-a, supondo que cada camada leva 2 minutos para preparar.
4 preparation-time .
! => 8
Defina a palavra remaining-time. Ela retira o número de minutos que a lasanha já passou no forno e deixa quantos minutos ela ainda precisa permanecer lá.
25 remaining-time .
! => 15
Defina a palavra total-working-time. Ela retira dois argumentos da pilha (primeiro o número de camadas da lasanha, depois o número de minutos que a lasanha já passou no forno) e deixa o tempo total gasto no preparo até agora: o tempo de preparo mais o tempo já passado no forno.
3 20 total-working-time .
! => 26
Crie sua conta no Exercism para aprender e dominar Factor com 47 conceitos163 exercícios e mentoria humana de verdade, tudo de graça.