In Clojure bezeichnet man das Binden eines Werts an einen Namen als Var. Vars auf oberster Ebene (globale Vars) ähneln Konstanten in anderen Sprachen.
Vars auf oberster Ebene definierst du mit def:
(def fingers 10)
fingers
;;=> 10
Mit defn kannst du eine Funktion definieren, die null oder mehr Argumente entgegennimmt. Diese Funktion würde zwei Zahlen addieren:
(defn add [x y]
(+ x y))
Diese Funktion nimmt zwei Argumente entgegen, die im Vektor [x y] stehen, gefolgt vom Körper der Funktion, der beliebig viele Ausdrücke enthalten kann. Der Rückgabewert ist immer das Ergebnis der Auswertung des letzten Ausdrucks im Körper, (+ x y). Dieser Ausdruck ist eine Liste, die einen Funktionsaufruf darstellt. Das erste Element der Liste ist die Funktion +, die mit den folgenden Elementen x und y als Argumente ausgewertet wird.
Die oben definierte Funktion add rufst du genauso auf:
(add 2 3)
;;=> 5
Funktionen und Werte in Clojure kannst du erst verwenden, nachdem du sie definiert hast, d. h. Formen werden immer in der Reihenfolge ausgewertet, in der sie erscheinen.
In Clojure hat Leerraum keine andere Bedeutung als die Formatierung.
Clojure organisiert Funktionen und Vars in Namespaces. Ein Namespace fasst zusammengehörige Funktionalität zusammen und wird mit dem Makro ns definiert:
(ns calculator)
(def pi 3.14)
(defn add [x y]
(+ x y))
Clojure unterstützt zwei Arten von Kommentaren. Einzeilige Kommentare beginnen mit ;, und die comment-Form verhindert die Auswertung von allem zwischen (comment und ).
In dieser Übung schreibst du etwas Code, um eine großartige Lasagne aus deinem Lieblingskochbuch zu kochen.
Du hast vier Aufgaben, die alle mit der Zeit zu tun haben, die du zum Kochen der Lasagne brauchst.
Definiere die Variable expected-time, um zu prüfen, wie viele Minuten die Lasagne im Ofen bleiben sollte. Laut Kochbuch beträgt die erwartete Ofenzeit 40 Minuten:
expected-time
;;=> 40
Definiere die Funktion remaining-time, die die tatsächlichen Minuten, die die Lasagne im Ofen war, als Argument nimmt und zurückgibt, wie viele Minuten die Lasagne noch im Ofen bleiben muss, basierend auf der erwarteten Ofenzeit in Minuten aus der vorherigen Aufgabe.
(remaining-time 30)
;;=> 10
Definiere die Funktion prep-time, die die Anzahl der Schichten, die du der Lasagne hinzugefügt hast, als Argument nimmt und zurückgibt, wie viele Minuten du mit der Vorbereitung der Lasagne verbracht hast, wobei jede Schicht 2 Minuten zum Vorbereiten braucht.
(prep-time 2)
;;=> 4
Definiere die Funktion total-time, die zwei Argumente nimmt: Das erste Argument ist die Anzahl der Schichten, die du der Lasagne hinzugefügt hast, und das zweite Argument ist die Anzahl der Minuten, die die Lasagne im Ofen war. Die Funktion sollte zurückgeben, wie viele Minuten du insgesamt mit dem Kochen der Lasagne verbracht hast, also die Summe aus der Vorbereitungszeit in Minuten und der Zeit in Minuten, die die Lasagne bis jetzt im Ofen verbracht hat.
(total-time 3 20)
;;=> 26
Melde dich bei Exercism an, um Clojure mit 12 Konzepte105 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.