# 2.Lispで計算 今日までに、様々なLispの方言(亜種)が作られてきました。 CommonLisp、Scheme、Clojure、EmacsLisp、Arc... 全く使われていない方言も含めると、その数は1000にも及ぶと思われます。(あるいはそれ以上。) 方言ごとに特徴があります。 例えば、Schemeは純粋で美しい文法ですが、CommonLispはどちらかというと、実用的でパワフルな方言と言われています。(もちろんSchemeは実用されていますし、CommonLispは美しいという人もたくさんいるので、方言の特徴の感じ方は人それぞれです。) 今回は、Scheme方言で学びます。 ## Schemeのインストール GaucheというSchemeを使います。 MacOSとLinuxについては試してないのでわかりません...(汗) * Windows リンクをクリックするとインストーラーがダウンロードされます - x86_64 https://github.com/shirok/Gauche/releases/download/release0_9_12/Gauche-mingw-0.9.12-64bit.msi - i686 https://github.com/shirok/Gauche/releases/download/release0_9_12/Gauche-mingw-0.9.12-32bit.msi * Mac OS https://brew.sh/index_ja こちらを参照してください。 * Linux https://brew.sh/index_ja こちらを参照してください。 ## Schemeを動かしてみよう Gauche(以下Lispと呼びます。)を起動したら、 `gosh$`と書かれています。これはここにプログラムを書いてくださいという意味です。 そしたら次のプログラムを書いて、Enterキー(Returnキー)を押してください。 ``` (+ 5 6) ``` このプログラムを実行すると、`5+6`の計算結果、11がコマンドラインに表示されます。 このプログラムは、一般的なプログラミング言語(CやJavaなど...)とは違う書き方をしています。 まず、`5+6`ではなく、`+ 5 6`と書かれています。さらに、()で囲まれていますよね。 これを理解するには少しLispの構文を知る必要がありそうです。 まず、一つ目。 CやJavaでは`関数名(引数)`のように書くのですが、Lispは `(関数名 引数1 引数2 引数3 ...)`のように書くのです。 そして、これは普通の言語とは違い、関数名と引数があまり区別されてないように見えます。`()`はリストを表す記号で、空白で区切ります。 例:`(Apple Banana Cherry)` しかし、Lispは一番最初の要素を関数と認識し、それ以外の要素を引数と認識するのです。(もちろん、普通にリストとして表すこともできます。それは次回以降解説します。) ということは、+は関数ということです。 普通のプログラミング言語では、演算子というものがありますが、Lispには演算子というものがなく関数と区別しません。 ## 計算の応用 引数には小数や複素数も使えます。 さらに、3つ以上引数をとることもできます。 ``` (+ 3 4 5) ``` こうすると、答えは12になります。 ### 他の演算 * 引き算 - ``` (- 5 3) ``` 答えは2です。 ``` (- 15 7 5) ``` 答えは3です。 `15-7-5`と同義です。 * 掛け算 * 掛け算は×ではなく、\*です。 ``` (* 4 6) ``` 答えは24です。 * 割り算 / 割り算は÷ではなく、/です。 ``` (/ 15 3) ``` 答えは5です。 ``` (/ 10 6) ``` 答えは5/3です。 1.6666...を返すのではなく、分数にして(約分して)返しています。 こちらのほうが、正確で簡潔なので、Lispはこれを採用しているのでしょうか。 ### 演算を重ねる ``` (* 5 4 (/ 16 (+ 2 (- 7 5)))) ``` こんなこともできます。答えは80です。