Track
/
Factor
Factor
/
Esercizi
/
Le squisite lasagne di Leah
Le squisite lasagne di Leah

Le squisite lasagne di Leah

Esercizio di apprendimento

Introduzione

In Cargo Shuffle hai incontrato la pila di dati di Factor e le parole di riordino che ne cambiano l'ordine. Questo esercizio riparte da lì: definirai parole che calcolano sui loro input invece di limitarsi a spostarli.

Commenti

Un ! avvia un commento di riga: Factor ignora tutto, da ! fino alla fine della riga. Gli esempi qui sotto usano ! sia per annotare ciò che fa il codice, sia per mostrare cosa stamperebbe.

Parole

Una parola è il nome che Factor dà a una funzione. Chiamare una parola estrae alcuni valori dalla cima della pila e ne inserisce altri. . estrae il valore in cima e lo stampa; le parole di aritmetica intera +, -, * estraggono due numeri e inseriscono il risultato:

2 3 + .    ! prints 5
8 3 - .    ! prints 5    (8 - 3, not 3 - 8)
2 3 * .    ! prints 6

Una parola correlata, .s, stampa tutta la pila di dati senza consumare nulla: è comoda nel listener (il prompt interattivo di Factor, dove scrivi il codice e vedi i risultati) per vedere cosa lascia dietro di sé un frammento. È per questo che più avanti alcuni esempi terminano con .s invece che con .: lasciano più di un valore sulla pila, e .s li mostra tutti.

Le parole aritmetiche vivono nel vocabolario math, quindi un file che le usa ha bisogno di math nella sua riga USING:.

Effetti sulla pila

Ogni parola è documentata con un effetto sulla pila nella forma ( inputs -- outputs ). È il contratto della parola: estrae gli input dalla cima della pila e lascia gli output al loro posto. I nomi al suo interno servono solo ad aiutarti a leggerlo. Factor non li usa: tiene traccia solo dell'ordine in cui i valori si trovano sulla pila.

! + is specified as ( x y -- sum )
! . is specified as ( x   --     )

La cima della pila è l'input a destra. Quindi in 8 3 - il 3 è in cima, l'effetto sulla pila è ( x y -- difference ) e il risultato è 8 - 3.

Un ? finale negli output è la convenzione per «un booleano», ma l'esercizio della lasagna usa solo numeri.

Più avanti incontreremo una parola di riordino di Cargo Shuffle: swap ( x y -- y x ), che scambia i due valori in cima quando sono nell'ordine sbagliato per la parola successiva.

Definire una parola

Il : avvia la definizione di una parola, subito dopo viene l'effetto sulla pila, poi il corpo e infine ; che la chiude.

: square ( x -- x^2 ) dup * ;

4 square .    ! => 16

Il compilatore di Factor verifica che il corpo corrisponda davvero all'effetto sulla pila dichiarato: una parola che dichiara ( x -- y ) ma lascia zero o due valori sulla pila non verrà compilata.

Costanti

Il CONSTANT: definisce un nome per un valore fisso. Una costante è essa stessa una parola: chiamarla inserisce il valore sulla pila:

CONSTANT: pi 3

pi pi * .    ! => 9

CONSTANT: fa parte della sintassi di base e non richiede una riga USING:. Metti le costanti in cima al file, prima di ogni parola che le usa.

Chiamare una parola da un'altra

Il corpo di una parola può chiamare qualsiasi parola già nello scope, comprese quelle che hai definito prima nello stesso file:

: double    ( x -- 2x ) 2 * ;
: quadruple ( x -- 4x ) double double ;

5 quadruple .    ! => 20

È così che l'ultimo compito dell'esercizio riutilizza uno precedente.

Convenzioni di denominazione

Le parole e le costanti usano entrambe il lowercase-kebab-case: lettere minuscole unite da trattini (per esempio, expected-bake-time, preparation-time).

Istruzioni

In questo esercizio scriverai del codice per aiutarti a cucinare una lasagna fantastica dal tuo libro di cucina preferito.

Hai quattro attività, tutte legate al tempo di cottura della lasagna.

1. Memorizza il tempo di cottura previsto in una costante

Definisci la costante expected-bake-time, che deve restituire il numero di minuti che la lasagna deve cuocere in forno.

Secondo il libro di cucina, la lasagna deve stare in forno per un totale di 40 minuti.

expected-bake-time .
! => 40

2. Calcola il tempo di preparazione in minuti

Definisci il word preparation-time. Preleva dallo stack il numero di strati che hai aggiunto alla lasagna e vi lascia il numero di minuti che hai impiegato a prepararla, supponendo che ogni strato richieda 2 minuti di preparazione.

4 preparation-time .
! => 8

3. Calcola il tempo di cottura rimanente in minuti

Definisci il word remaining-time. Preleva dallo stack il numero di minuti che la lasagna ha già passato in forno e vi lascia il numero di minuti che le restano ancora da cuocere.

25 remaining-time .
! => 15

4. Calcola il tempo di lavoro totale in minuti

Definisci il word total-working-time. Preleva due argomenti dallo stack, prima il numero di strati della lasagna e poi il numero di minuti che la lasagna ha già passato in forno, e vi lascia il tempo di lavoro totale speso finora: il tempo di preparazione più il tempo già trascorso in forno.

3 20 total-working-time .
! => 26
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Factor Exercism

Vuoi iniziare Le squisite lasagne di Leah?

Iscriviti a Exercism per imparare e padroneggiare Factor con 47 concetti163 esercizi e il mentoring di persone reali, tutto gratis.