和许多语言一样,Common Lisp 中的数字有几种类型,其中最基本的两种是:
和许多语言一样,Common Lisp 包含整数。
整数是不带小数点的完整数字(比如-6、0、25、1234等)。
Common Lisp 对整数的大小没有任何限制。 整数可以任意大(如果是负数,也可以任意小)。
一般来说,如果你只处理整数,就应该优先使用整数,因为经过多次计算之后,它们不会像浮点数那样损失精度。
和许多语言一样,Common Lisp 包含浮点数。
浮点数带小数点,可以是小数,也可以是整数(比如3.14、-1.7、99.99、2048.0)。
Common Lisp 的大多数运算都使用标准的算术运算符,但有一点比较特别:它使用“前缀表示法”,而不是大家更熟悉的“中缀表示法”。
更直观地看:
;; Infix-notation (non-lisp languages)
1 + 2 + 3 + 4 + 5 ; => 15
;; Prefix-notation (lisp languages)
(+ 1 2 3 4 5) ; => 15
前缀表示法会把2 + 2这样的运算变成有点陌生的(+ 2 2)形式,但它让同时对多个数字进行运算变得容易得多。
Common Lisp 拥有所有常见的函数:+、-、*、/,分别用于加法、减法、乘法和除法。
在考虑除法时,你可能想知道除法的余数,这可以用mod(表示求模)函数来完成,它接受一个数字和一个除数作为实参:
(mod 4 2) ; => 0
(mod 2 4) ; => 2
(mod 10 3) ; => 1
最后,你可能会发现,用=(等于)、/=(不等于)和>=(大于等于)这类函数来比较不同的数字很有用。
当这些比较成立时(比如(= 1 1)),它们返回T;不成立时(比如(> 0 1)),它们返回NIL。
Lisp 外星人 Lilly 热爱烹饪。她想和朋友们办一场披萨派对,但为了充分利用食材,她希望在开始前就确切知道每种食材需要多少。
为此,Lilly 写了一个程序来自动完成一部分规划工作,但还需要你来帮忙完成。你愿意帮 Lilly 办一场比例完美的披萨派对吗?
首先,每一张出色的披萨都从美味的面团开始!
Lilly 喜欢薄而酥脆、饼边更厚的披萨。中间部分的面团固定需要 200 克,而每 20 厘米饼边需要 45 克面团。
所幸,Lilly 根据披萨数量(n)和它们的直径(d)算出了面团克数(g)的公式:
g = n * (((45 * pi * d) / 20) + 200)
Lilly 需要一个函数:
例如,要做 4 张直径 30 厘米的披萨:
(dough-calculator 4 30) ; => 1648
Lilly 涂抹酱料时一丝不苟,但她做的披萨大小可能并不一致。
为了算出直径(d),她使用下面的公式,其中涂上的酱料量(s)是一个变量:
d = square-root of ((40 * s) / (3 * pi))
Lilly 需要一个函数,根据涂上的每毫升酱料(s)计算披萨的直径(d)。
例如,假设 Lilly 用了 250 毫升酱料:
(size-from-sauce 250) ; => 32.57
在 Lilly 所在的星球上,所有奶酪都是完美的立方体,并且按尺寸出售。(你还能期待什么呢?这里毕竟是外星球……)
Lilly 又推导出一个公式,用来计算边长为(l)的奶酪立方体能做出多少张直径为(d)的披萨(n):
n = (2 * (l^3)) / (3* pi * (d^2))
创建一个函数:
例如,给定一个 25x25x25 厘米的奶酪立方体和直径 30 厘米的披萨:
(pizzas-per-cube 25 30) ; => 3
最后,Lilly 希望把每张披萨都切成 8 块,并在朋友们之间平均分配。
创建一个函数:
T,否则返回NIL。例如:
;; 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