Common Lispでは、多くの言語と同様に、数値にはいくつかの種類があります。もっとも基本的なもののうち2つを紹介します。
多くの言語と同様に、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関数(moduloの略)を使います。これは数値と割る数を引数に取ります。
(mod 4 2) ; => 0
(mod 2 4) ; => 2
(mod 10 3) ; => 1
最後に、=(等しい)、/=(等しくない)、>=(以上)などの関数を使って、数値を比較すると便利です。
これらの比較が真の場合((= 1 1)のように)はTを返し、真でない場合((> 0 1)のように)はNILを返します。
Lispの宇宙人リリーは料理が大好きです。友達とピザパーティーを開きたいのですが、材料をできるだけ無駄なく使うために、始める前にそれぞれの材料がどれだけ必要になるかを正確に知りたいと思っています。
これを解決するために、リリーは計画の一部を自動化するプログラムを書き始めましたが、完成させるには助けが必要です。リリーが、配合の完璧なピザパーティーを開くのを手伝ってみませんか?
まず最初に。どんなに素晴らしいピザも、おいしい生地から始まります。
リリーは、薄くてパリッとしていて、縁が少し厚めのピザが好きです。 中央部分に必要な生地は常に200gですが、縁は20cmごとに45gの生地が必要です。
ありがたいことに、リリーはピザの枚数(n)とその直径(d)から、生地のグラム数(g)を求める式を計算してくれました。
g = n * (((45 * pi * d) / 20) + 200)
リリーに必要なのは、次のような関数です。
たとえば、直径30cmのピザを4枚作るには:
(dough-calculator 4 30) ; => 1648
リリーはソースを塗るときは几帳面ですが、ピザの大きさは一定しないことがあります。
直径(d)を求めるために、リリーは塗ったソースの量(s)を変数にした、次の式を使います。
d = square-root of ((40 * s) / (3 * pi))
リリーに必要なのは、塗ったソース1ミリリットルあたりからピザの直径(d)を計算する関数です。
たとえば、リリーがソースを250ml使ったとします:
(size-from-sauce 250) ; => 32.57
リリーの星では、チーズはどれも完璧な立方体で、大きさごとに売られています。 (何を期待していたんですか? ここは何しろ宇宙の星ですから……)
ここでもまた、リリーは一辺の長さ(l)のチーズの立方体から作れる、ある直径(d)のピザの枚数(n)を求める式を計算してくれました。
n = (2 * (l^3)) / (3* pi * (d^2))
次のような関数を作ってください。
たとえば、25x25x25cmのチーズの立方体と、直径30cmのピザの場合:
(pizzas-per-cube 25 30) ; => 3
最後に、リリーはピザをそれぞれ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
Exercismに登録すれば、27個のコンセプト92個の演習、そして本物の人間によるメンタリングとともに、Common Lispを学んでマスターできます。すべて無料です。