Em Common Lisp, tal como em muitas linguagens, os números existem em vários tipos. Dois dos mais básicos são:
Tal como muitas linguagens, o Common Lisp tem números inteiros.
São números sem parte decimal (como -6, 0, 25, 1234, etc.).
O Common Lisp não define limites para a magnitude dos inteiros. Os inteiros podem ser arbitrariamente grandes (ou pequenos, se forem negativos).
Em geral, se estás a trabalhar apenas com números inteiros, deves dar preferência aos inteiros, porque não sofrem a mesma perda de precisão que os números de vírgula flutuante ao longo de muitos cálculos.
Tal como muitas linguagens, o Common Lisp tem números de vírgula flutuante.
São números fracionários ou inteiros que incluem uma parte decimal (como 3.14, -1.7, 99.99, 2048.0).
O Common Lisp usa os operadores aritméticos habituais para a maioria das operações, mas é um pouco invulgar por usar uma "notação prefixa" em vez da mais familiar "notação infixa".
De forma mais visual:
;; Infix-notation (non-lisp languages)
1 + 2 + 3 + 4 + 5 ; => 15
;; Prefix-notation (lisp languages)
(+ 1 2 3 4 5) ; => 15
Embora a notação prefixa transforme algumas operações, como 2 + 2, na forma um pouco menos familiar (+ 2 2), torna muito mais fácil operar com vários números ao mesmo tempo.
O Common Lisp tem todas as funções típicas: +, -, *, / para a adição, a subtração, a multiplicação e a divisão.
Ao pensar na divisão, podes querer saber o resto de uma divisão. Isso faz-se com a função mod (de módulo), que recebe um número e um divisor como argumentos:
(mod 4 2) ; => 0
(mod 2 4) ; => 2
(mod 10 3) ; => 1
Por fim, pode ser-te útil comparar números diferentes com funções como = (igual), /= (diferente de) e >= (maior ou igual a).
Quando estas comparações são verdadeiras (como em (= 1 1)), devolvem T e, quando não são (como em (> 0 1)), devolvem NIL.
A Lilly, a alienígena de Lisp, adora cozinhar. Quer dar uma festa de pizza com os amigos, mas, para aproveitar ao máximo os ingredientes, gostaria de saber exatamente de quanto de cada ingrediente vai precisar antes de começar.
Para resolver isto, a Lilly esboçou um programa que automatiza parte do planeamento, mas precisa da tua ajuda para o terminar. Ajudas a Lilly a dar a festa de pizza perfeitamente proporcionada?
Antes de mais, todas as grandes pizzas começam com uma massa deliciosa!
A Lilly é fã de pizzas finas e crocantes, com uma borda mais grossa. A massa necessária para o meio é sempre 200 g, mas cada 20 cm de borda exige 45 g de massa.
Felizmente, a Lilly calculou a equação que dá os gramas de massa (g) a partir do número de pizzas (n) e do seu diâmetro (d):
g = n * (((45 * pi * d) / 20) + 200)
A Lilly precisa de uma função que:
Por exemplo, para fazer 4 pizzas com 30 cm de diâmetro:
(dough-calculator 4 30) ; => 1648
A Lilly é meticulosa a espalhar o molho, mas o tamanho das suas pizzas pode ser irregular.
Para descobrir o diâmetro (d), usa a equação abaixo, com o molho espalhado (s) como variável:
d = square-root of ((40 * s) / (3 * pi))
A Lilly precisa de uma função que calcule o diâmetro da pizza (d) a partir de cada mililitro de molho espalhado (s).
Por exemplo, se a Lilly usou 250 ml de molho:
(size-from-sauce 250) ; => 32.57
No planeta da Lilly, todo o queijo vem em cubos perfeitos e é vendido por tamanho. (O que estavas à espera? Afinal, este é um planeta alienígena...)
Mais uma vez, a Lilly calculou uma equação para o número de pizzas (n) de um determinado diâmetro (d) que se fazem a partir de um cubo de queijo com aresta (l):
n = (2 * (l^3)) / (3* pi * (d^2))
Cria uma função que:
Por exemplo, para um cubo de queijo de 25x25x25 cm e pizzas com 30 cm de diâmetro:
(pizzas-per-cube 25 30) ; => 3
Por fim, a Lilly quer que as suas pizzas se dividam em 8 fatias cada e sejam distribuídas igualmente pelos amigos.
Cria uma função que:
T se as pizzas se distribuírem igualmente pelos amigos e NIL caso contrário.Por exemplo:
;; 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
Inscreve-te no Exercism para aprenderes e dominares Common Lisp com 27 conceitos92 exercícios, e mentoria humana real, tudo grátis.