In Common Lisp gibt es, wie in vielen Sprachen, mehrere Zahlentypen. Zwei der grundlegendsten sind:
Wie viele Sprachen kennt auch Common Lisp Ganzzahlen.
Das sind ganze Zahlen ohne Dezimalpunkt (wie -6, 0, 25, 1234 usw.).
Common Lisp setzt keine Grenzen für die Größe von Ganzzahlen. Ganzzahlen können beliebig groß (oder klein, wenn negativ) sein.
Wenn du nur mit ganzen Zahlen arbeitest, solltest du im Allgemeinen Ganzzahlen bevorzugen, denn sie leiden nicht unter dem Genauigkeitsverlust, den Gleitkommazahlen bei vielen Berechnungen erleiden.
Wie viele Sprachen kennt auch Common Lisp Gleitkommazahlen.
Das sind Bruchzahlen oder ganze Zahlen mit einem Dezimalpunkt (wie 3.14, -1.7, 99.99, 2048.0).
Common Lisp verwendet für die meisten Operationen die üblichen arithmetischen Operatoren, ist aber insofern etwas Besonderes, als es die „Präfixnotation“ statt der gebräuchlicheren „Infixnotation“ verwendet.
Anschaulicher:
;; Infix-notation (non-lisp languages)
1 + 2 + 3 + 4 + 5 ; => 15
;; Prefix-notation (lisp languages)
(+ 1 2 3 4 5) ; => 15
Die Präfixnotation verwandelt zwar manche Operationen wie 2 + 2 in die etwas ungewohnte Form (+ 2 2), dafür macht sie es viel einfacher, mit mehr als einer Zahl gleichzeitig zu arbeiten.
Common Lisp hat all die typischen Funktionen: +, -, *, / für Addition, Subtraktion, Multiplikation und Division.
Bei der Division möchte man manchmal den Rest einer Division wissen. Das erledigt die Funktion mod (für Modulo), die eine Zahl und einen Divisor als Argumente entgegennimmt:
(mod 4 2) ; => 0
(mod 2 4) ; => 2
(mod 10 3) ; => 1
Schließlich kann es nützlich sein, verschiedene Zahlen mit Funktionen wie = (gleich), /= (ungleich) und >= (größer oder gleich) zu vergleichen.
Wenn diese Vergleiche wahr sind (wie in (= 1 1)), geben sie T zurück, und wenn sie es nicht sind (wie in (> 0 1)), geben sie NIL zurück.
Lilly, das Lisp-Alien, liebt es zu kochen. Sie möchte mit ihren Freunden eine Pizza-Party schmeißen, aber um das Beste aus ihren Zutaten herauszuholen, möchte sie vorher genau wissen, wie viel sie von jeder Zutat braucht.
Um das zu lösen, hat Lilly ein Programm entworfen, das einen Teil der Planung automatisieren soll, aber sie braucht deine Hilfe, um es fertigzustellen. Hilfst du Lilly dabei, die perfekt proportionierte Pizza-Party zu schmeißen?
Eins nach dem anderen: Jede großartige Pizza beginnt mit einem leckeren Teig!
Lilly mag dünne, knusprige Pizzas mit einem dickeren Rand. Der Teig für die Mitte beträgt konstant 200 g, aber jeder 20 cm Rand benötigt 45 g Teig.
Zum Glück hat Lilly die Gleichung für die Gramm Teig (g) aus der Anzahl der Pizzas (n) und ihrem Durchmesser (d) berechnet:
g = n * (((45 * pi * d) / 20) + 200)
Lilly braucht eine Funktion, die:
Zum Beispiel, um 4 Pizzas mit 30 cm Durchmesser zu backen:
(dough-calculator 4 30) ; => 1648
Lilly ist sehr genau, wenn sie ihre Soße aufträgt, aber die Größe ihrer Pizzas kann schwanken.
Um den Durchmesser (d) zu ermitteln, verwendet sie die folgende Gleichung mit der aufgetragenen Soße (s) als Variable:
d = square-root of ((40 * s) / (3 * pi))
Lilly braucht eine Funktion, die den Pizza-Durchmesser (d) aus jedem Milliliter aufgetragener Soße (s) berechnet.
Zum Beispiel, wenn Lilly 250 ml Soße verwendet hat:
(size-from-sauce 250) ; => 32.57
Auf Lillys Planeten kommt jeder Käse in perfekten Würfeln und wird nach Größe verkauft. (Was hast du erwartet? Das ist schließlich ein fremder Planet ...)
Wieder einmal hat Lilly eine Gleichung für die Anzahl der Pizzas (n) mit einem bestimmten Durchmesser (d) berechnet, die aus einem Käsewürfel mit der Seitenlänge (l) entstehen:
n = (2 * (l^3)) / (3* pi * (d^2))
Erstelle eine Funktion, die:
Zum Beispiel bei einem 25x25x25 cm Käsewürfel und Pizzas mit 30 cm Durchmesser:
(pizzas-per-cube 25 30) ; => 3
Zum Schluss möchte Lilly, dass ihre Pizzas jeweils in 8 Stücke geschnitten und gleichmäßig unter ihren Freunden verteilt werden.
Erstelle eine Funktion, die:
T zurückgibt, wenn sich die Pizzas gleichmäßig unter den Freunden verteilen lassen, andernfalls NIL.Zum Beispiel:
;; For splitting 3 pizzas between 4 friends
(fair-share-p 3 4) ; => T
;; For splitting 2 pizzas between 3 friends
(fair-share-p 2 3) ; => NIL
Melde dich bei Exercism an, um Common Lisp mit 27 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.