Percursos
/
Factor
Factor
/
Exercícios
/
A Deliciosa Lasanha da Leah
A Deliciosa Lasanha da Leah

A Deliciosa Lasanha da Leah

Exercício de aprendizagem

Introdução

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.

Comentários

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.

Palavras

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

Efeitos de pilha

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.

Definir uma palavra

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.

Constantes

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.

Chamar uma palavra a partir de outra

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.

Convenções de nomenclatura

Tanto as palavras como as constantes usam lowercase-kebab-case: letras minúsculas unidas por hífenes (por exemplo, expected-bake-time, preparation-time).

Instruções

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.

1. Guarda o tempo de cozedura esperado numa constante

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

2. Calcula o tempo de preparação em minutos

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

3. Calcula o tempo restante no forno em minutos

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

4. Calcula o tempo total de trabalho em minutos

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
Editar via GitHub A ligação abre numa nova janela ou separador
Factor Exercism

Estás pronto para começar A Deliciosa Lasanha da Leah?

Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.