Pour définir une fonction globale en Common Lisp, on utilise l'expression defun.
Cette expression prend comme premier argument une liste de paramètres (une liste vide signifie que la fonction n'a pas de paramètres).
Viennent ensuite une chaîne de documentation facultative (voir plus bas), puis zéro ou plusieurs expressions qui constituent le « corps » de la fonction.
Une fonction peut avoir zéro ou plusieurs paramètres.
(defun no-args () (+ 1 1))
(defun add-one (x) (1+ x))
(defun add-nums (x y) (+ x y))
Pour appeler une fonction, on évalue une expression dont le premier élément est le symbole qui désigne la fonction et dont les éléments restants sont les arguments de la fonction (s'il y en a).
La valeur à laquelle s'évalue une fonction est la valeur de la dernière expression évaluée dans le corps de la fonction. Toutes les fonctions s'évaluent à une valeur.
(add-nums 2 2) ;; => 4
Une fonction peut aussi comporter une chaîne de documentation facultative (aussi appelée « docstring »).
Si elle est fournie, elle vient après la liste des arguments mais avant le corps de la fonction.
On peut accéder à la chaîne de documentation via 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'extraterrestre Lisp, est de retour et cuisine encore plus ! Cette fois, Lilly va préparer la lasagne d'extraterrestre Lisp, qui n'est pas sans rappeler la lasagne humaine.
Lilly aura besoin de quelques fonctions pour l'aider à déterminer le minutage de la cuisson de la lasagne. Et chacune doit être bien documentée pour que Lilly n'oublie pas le rôle de chacune.
Peux-tu aider Lilly à écrire les fonctions qui lui permettront de chronométrer la cuisson de la lasagne ?
Définis la fonction expected-time-in-oven, qui ne prend aucun paramètre et renvoie le nombre de minutes que la lasagne doit passer au four. Selon la tradition des extraterrestres Lisp (exactement comme cuisinait l'unité parentale de Lilly), le temps de cuisson prévu au four est de 337 minutes :
(expected-time-in-oven) ;; => 337
Définis la fonction remaining-minutes-in-oven, qui prend en paramètre le nombre de minutes que la lasagne a déjà passées au four et renvoie combien de minutes elle doit encore y rester, d'après le temps de cuisson prévu au four de la tâche précédente.
(remaining-minutes-in-oven 100) ;; => 237
Définis la fonction preparation-time-in-minutes, qui prend en paramètre le nombre de couches que Lilly a ajoutées à la lasagne et renvoie le nombre de minutes qu'elle a passées à la préparer, en supposant que chaque couche demande 19 minutes de préparation.
(preparation-time-in-minutes 3) ;; => 57
Définis la fonction elapsed-time-in-minutes, qui prend deux paramètres : le premier est le nombre de couches que Lilly a ajoutées à la lasagne, et le second le nombre de minutes que la lasagne a passées au four. La fonction doit renvoyer le nombre de minutes que Lilly a consacrées à la cuisson de la lasagne, c'est-à-dire la somme du temps de préparation en minutes et du temps, en minutes, que la lasagne a déjà passé au four à cet instant.
(elapsed-time-in-minutes 3 100) ;; => 157
Inscris-toi sur Exercism pour apprendre et maîtriser Common Lisp avec 27 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.