Per definire una funzione globale in Common Lisp si usa l'espressione defun.
Questa espressione prende come primo argomento una lista di parametri (una lista vuota significa che la funzione non ha parametri).
Segue poi una stringa di documentazione opzionale (vedi sotto), quindi zero o più espressioni che costituiscono il «corpo» della funzione.
Le funzioni possono avere zero o più parametri.
(defun no-args () (+ 1 1))
(defun add-one (x) (1+ x))
(defun add-nums (x y) (+ x y))
Per chiamare una funzione si valuta un'espressione che ha come primo elemento il simbolo che designa la funzione e come elementi rimanenti gli argomenti della funzione (se ce ne sono).
Il valore a cui si valuta una funzione è il valore dell'ultima espressione valutata nel corpo della funzione. Tutte le funzioni si valutano a un valore.
(add-nums 2 2) ;; => 4
Le funzioni possono anche avere, in modo opzionale, una stringa di documentazione (chiamata anche «docstring»).
Se presente, viene dopo la lista degli argomenti ma prima del corpo della funzione.
Alla stringa di documentazione si può accedere tramite documentation.
(defun add-nums (x y) "Add X and Y together" (+ x y))
(documentation 'add-nums 'function) ;; => "Add X and Y together"
;; Note that if one provides a docstring but fails to provide a body
;; then the docstring is interpreted by Common Lisp as the body, not
;; the docstring
(defun no-body ())
(no-body) ;; => NIL
(defun mistake () "This is not a docstring")
(mistake) ;; => "This is not a docstring"
(documentation 'mistake 'function) ;; => NIL
Lilly l'alieno Lisp è di nuovo ai fornelli! Questa volta creerà la Lasagna dell'alieno Lisp, che non è poi così diversa dalla lasagna umana.
A Lilly serviranno alcune funzioni per calcolare i tempi di cottura della lasagna. E ognuna deve avere una buona documentazione, così Lilly non dimenticherà cosa fa ciascuna.
Puoi aiutare Lilly a scrivere le funzioni che servono a calcolare i tempi di cottura della lasagna?
Definisci la funzione expected-time-in-oven, che non prende alcun parametro e restituisce per quanti minuti la lasagna deve stare in forno. Secondo la tradizione degli alieni Lisp (proprio come cucinava l'unità genitoriale di Lilly), il tempo previsto in forno, in minuti, è 337:
(expected-time-in-oven) ;; => 337
Definisci la funzione remaining-minutes-in-oven, che prende come parametro i minuti effettivi che la lasagna ha già passato in forno e restituisce quanti minuti la lasagna deve ancora restare in forno, sulla base del tempo previsto in forno indicato nel compito precedente.
(remaining-minutes-in-oven 100) ;; => 237
Definisci la funzione preparation-time-in-minutes, che prende come parametro il numero di strati che Lilly ha aggiunto alla lasagna e restituisce quanti minuti Lilly ha impiegato a preparare la lasagna, ipotizzando che ogni strato richieda 19 minuti di preparazione.
(preparation-time-in-minutes 3) ;; => 57
Definisci la funzione elapsed-time-in-minutes, che prende due parametri: il primo è il numero di strati che Lilly ha aggiunto alla lasagna, il secondo è il numero di minuti che la lasagna ha passato in forno. La funzione deve restituire quanti minuti Lilly ha lavorato alla cottura della lasagna, cioè la somma del tempo di preparazione in minuti e del tempo in minuti che la lasagna ha passato in forno fino a quel momento.
(elapsed-time-in-minutes 3 100) ;; => 157
Iscriviti a Exercism per imparare e padroneggiare Common Lisp con 27 concetti92 esercizi e il mentoring di persone reali, tutto gratis.