In Common Lisp, come in molte lingue, i numeri esistono in diversi tipi: i due più fondamentali sono:
Come in molte lingue, Common Lisp contiene numeri interi.
Sono numeri interi senza punto decimale (come -6, 0, 25, 1234, ecc.)
Common Lisp non definisce limiti alla grandezza degli interi. Gli interi possono essere arbitrariamente grandi (o piccoli, se negativi).
In generale, se lavori solo con numeri interi, conviene preferire gli interi, perché non soffrono della stessa perdita di precisione dei numeri in virgola mobile su molti calcoli.
Come in molte lingue, Common Lisp contiene numeri in virgola mobile.
Sono numeri frazionari o interi che includono un punto decimale (come 3.14, -1.7, 99.99, 2048.0).
Common Lisp usa gli operatori aritmetici standard per la maggior parte delle operazioni, ma è piuttosto insolito nell'usare una «notazione prefissa» invece della più familiare «notazione infissa».
Per vederlo più chiaramente:
;; Infix-notation (non-lisp languages)
1 + 2 + 3 + 4 + 5 ; => 15
;; Prefix-notation (lisp languages)
(+ 1 2 3 4 5) ; => 15
Sebbene la notazione prefissa trasformi alcune operazioni come 2 + 2 nella forma un po' insolita (+ 2 2), rende molto più facile operare su più numeri contemporaneamente.
Common Lisp ha tutte le funzioni tipiche: +, -, *, / per addizione, sottrazione, moltiplicazione e divisione.
Quando si considera la divisione, può essere utile conoscere il resto di una divisione; questo si ottiene con la funzione mod (per modulo), che prende come argomenti un numero e un divisore:
(mod 4 2) ; => 0
(mod 2 4) ; => 2
(mod 10 3) ; => 1
Infine, può essere utile confrontare numeri diversi usando funzioni come = (uguale), /= (diverso da) e >= (maggiore o uguale a).
Quando questi confronti sono veri (come in (= 1 1)), restituiscono T, mentre quando non lo sono (come in (> 0 1)), restituiscono NIL.
Lilly l'aliena di Lisp adora cucinare. Vuole organizzare una festa della pizza con i suoi amici ma, per sfruttare al meglio i suoi ingredienti, vorrebbe sapere esattamente quanto di ogni ingrediente le servirà prima di iniziare.
Per risolvere il problema, Lilly ha abbozzato un programma per automatizzare una parte della pianificazione, ma ha bisogno del tuo aiuto per finirlo. Aiuterai Lilly a organizzare la festa della pizza dalle proporzioni perfette?
Prima di tutto, ogni grande pizza inizia con un impasto delizioso!
Lilly adora le pizze sottili e croccanti con una crosta più spessa. L'impasto necessario per il centro è un valore costante di 200 g, ma ogni 20 cm di crosta richiede 45 g di impasto.
Per fortuna, Lilly ha calcolato l'equazione per i grammi di impasto (g) a partire dal numero di pizze (n) e dal loro diametro (d):
g = n * (((45 * pi * d) / 20) + 200)
Lilly ha bisogno di una funzione che:
Per esempio, per fare 4 pizze di 30 cm di diametro:
(dough-calculator 4 30) ; => 1648
Lilly è meticolosa quando stende la salsa, ma le dimensioni delle sue pizze possono essere incostanti.
Per calcolare il diametro (d), usa l'equazione seguente, con la salsa applicata (s) come variabile:
d = square-root of ((40 * s) / (3 * pi))
Lilly ha bisogno di una funzione che calcoli il diametro della pizza (d) a partire da ogni millilitro di salsa applicata (s).
Per esempio, dato che Lilly ha usato 250 ml di salsa:
(size-from-sauce 250) ; => 32.57
Sul pianeta di Lilly, tutto il formaggio arriva in cubi perfetti e viene venduto in base alla dimensione. (Cosa ti aspettavi? Dopotutto è un pianeta alieno...)
Ancora una volta, Lilly ha calcolato un'equazione per il numero di pizze (n) di un certo diametro (d) che si possono fare con un cubo di formaggio di lato (l):
n = (2 * (l^3)) / (3* pi * (d^2))
Crea una funzione che:
Per esempio, dato un cubo di formaggio di 25x25x25 cm e pizze di 30 cm di diametro:
(pizzas-per-cube 25 30) ; => 3
Infine, Lilly vuole che le sue pizze si dividano in 8 fette ciascuna e siano distribuite equamente tra i suoi amici.
Crea una funzione che:
T se le pizze si distribuiranno equamente tra gli amici e NIL altrimenti.Per esempio:
;; 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
Iscriviti a Exercism per imparare e padroneggiare Common Lisp con 27 concetti92 esercizi e il mentoring di persone reali, tutto gratis.