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.
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.
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:.
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.
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.
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.
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.
Le parole e le costanti usano entrambe il lowercase-kebab-case: lettere minuscole unite da trattini (per esempio, expected-bake-time, preparation-time).
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.
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
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
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
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
Iscriviti a Exercism per imparare e padroneggiare Factor con 47 concetti163 esercizi e il mentoring di persone reali, tutto gratis.