Um in Common Lisp eine globale Funktion zu definieren, verwendet man den defun-Ausdruck.
Dieser Ausdruck nimmt als erstes Argument eine Liste von Parametern entgegen (eine leere Liste bedeutet, dass die Funktion keine Parameter hat).
Danach folgt ein optionaler Dokumentations-String (siehe unten) und anschließend null oder mehr Ausdrücke, die den „Rumpf“ der Funktion bilden.
Funktionen können null oder mehr Parameter haben.
(defun no-args () (+ 1 1))
(defun add-one (x) (1+ x))
(defun add-nums (x y) (+ x y))
Eine Funktion ruft man auf, indem man einen Ausdruck auswertet, dessen erstes Element das Symbol ist, das die Funktion bezeichnet, und dessen restliche Elemente die Argumente für die Funktion sind (falls es welche gibt).
Der Wert, zu dem eine Funktion auswertet, ist der Wert des letzten Ausdrucks im Rumpf der Funktion, der ausgewertet wurde. Alle Funktionen werten zu einem Wert aus.
(add-nums 2 2) ;; => 4
Funktionen können außerdem optional einen Dokumentations-String haben (auch „Docstring“ genannt).
Wenn er angegeben wird, steht er nach der Argumentliste, aber vor dem Rumpf der Funktion.
Auf den Dokumentations-String kann man über documentation zugreifen.
(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, das Lisp-Alien, ist zurück und kocht wieder! Diesmal bereitet Lilly eine Lisp-Alien-Lasagne zu, die einer menschlichen Lasagne nicht ganz unähnlich ist.
Lilly braucht ein paar Funktionen, mit denen sich die Backzeit der Lasagne bestimmen lässt. Und jede davon braucht eine gute Dokumentation, damit Lilly nicht vergisst, was sie tut.
Kannst du Lilly helfen, Funktionen zu schreiben, mit denen sich die Backzeit der Lasagne bestimmen lässt?
Definiere die Funktion expected-time-in-oven, die keine Parameter
entgegennimmt und zurückgibt, wie viele Minuten die Lasagne im Ofen bleiben
sollte. Nach der Tradition der Lisp-Aliens (genau wie Lillys Elterneinheit zu
kochen pflegte) beträgt die erwartete Backzeit in Minuten 337:
(expected-time-in-oven) ;; => 337
Definiere die Funktion remaining-minutes-in-oven, die die tatsächlichen
Minuten, die die Lasagne bereits im Ofen war, als Parameter entgegennimmt und
zurückgibt, wie viele Minuten die Lasagne noch im Ofen bleiben muss. Grundlage
dafür ist die erwartete Backzeit in Minuten aus der vorherigen Aufgabe.
(remaining-minutes-in-oven 100) ;; => 237
Definiere die Funktion preparation-time-in-minutes, die die Anzahl der
Schichten, die Lilly zur Lasagne hinzugefügt hat, als Parameter entgegennimmt
und zurückgibt, wie viele Minuten Lilly für die Vorbereitung der Lasagne
gebraucht hat. Dabei dauert jede Schicht 19 Minuten.
(preparation-time-in-minutes 3) ;; => 57
Definiere die Funktion elapsed-time-in-minutes, die zwei Parameter
entgegennimmt: Der erste Parameter ist die Anzahl der Schichten, die Lilly zur
Lasagne hinzugefügt hat, und der zweite Parameter ist die Anzahl der Minuten,
die die Lasagne bereits im Ofen war. Die Funktion soll zurückgeben, wie viele
Minuten Lilly mit dem Kochen der Lasagne verbracht hat. Das ist die Summe aus
der Vorbereitungszeit in Minuten und der Zeit in Minuten, die die Lasagne bis
zu diesem Moment im Ofen verbracht hat.
(elapsed-time-in-minutes 3 100) ;; => 157
Melde dich bei Exercism an, um Common Lisp mit 27 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.