Trilhas
/
Factor
Factor
/
Exercícios
/
A lasanha deliciosa da Leah
A lasanha deliciosa da Leah

A lasanha deliciosa da Leah

Exercício de aprendizagem

Introdução

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.

Comentários

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.

Palavras

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:.

Efeitos de pilha

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.

Definir uma 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.

Constantes

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.

Chamar uma palavra de dentro de outra

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.

Convenções de nomenclatura

Palavras e constantes usam ambas lowercase-kebab-case: letras minúsculas unidas por hífens (por exemplo, expected-bake-time, preparation-time).

Instruções

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.

1. Armazene o tempo esperado de forno em uma constante

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

2. Calcule o tempo de preparo em minutos

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

3. Calcule o tempo restante de forno em minutos

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

4. Calcule o tempo total de trabalho em minutos

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
Editar via GitHub O link abre em uma nova janela ou aba
Factor Exercism

Tudo pronto para começar A lasanha deliciosa da Leah?

Crie sua conta no Exercism para aprender e dominar Factor com 47 conceitos163 exercícios e mentoria humana de verdade, tudo de graça.