全5515文字
PR

 次にDrRacketでSchemeを使えるようにしよう。メニューの「言語」から「言語の選択」を選び、下のほうにある「Other Languages」から「R5RS」を選択する。R5RSはSchemeの少し古い仕様だが、Schemeの主要な機能を問題なく利用できる。

メニューの「言語」から「言語の選択」を選び、「Other Languages」から「R5RS」を選ぶ。これでSchemeの主な機能を使えるようになる
メニューの「言語」から「言語の選択」を選び、「Other Languages」から「R5RS」を選ぶ。これでSchemeの主な機能を使えるようになる
[画像のクリックで拡大表示]

 これで準備OKだ。早速、Lispのプログラムを書いてみよう。DrRacketの上半分の入力欄に半角で「(+ 1 1)」と入力してほしい。かっこの中に「+」と数字の「1」を2つ、半角スペースで区切って書く。

 これは「1足す1」を計算するプログラムだ。他の言語では「1+1」と書くのが普通なので、ちょっと変わっている。Lispでは、かっこの中の最初に演算子や関数名を書き、それに続けて引数を書く。演算子の中置記法(数値と数値の間に演算子を記述する方法)はなく、演算子を使った計算も関数適用と同じ形で記述する。最初のうちはついうっかり「1+1」と書きがちだが、慣れれば大丈夫だ。

 では実行してみよう。「実行」と書いてあるボタンを押すと、プログラムが実行され、下半分の表示欄に実行結果の「2」が表示される。

DrRacketで「1+1」を計算するプログラムを実行する。「(+ 1 1)」と入力して実行ボタンを押すと、計算結果の「2」が表示される
DrRacketで「1+1」を計算するプログラムを実行する。「(+ 1 1)」と入力して実行ボタンを押すと、計算結果の「2」が表示される
[画像のクリックで拡大表示]

データであると同時に実行もできるリスト

 ここでLispの名前の由来を紹介しよう。Lispは「リストプロセッサー(list processor)」を略したものだ。Lispでは「リスト」という形式のデータを扱うだけでなく、プログラム自体もリストの形をしている。これにより、プログラム自体をリストとしてプログラムで扱うことができる。これがLispの力の源泉だ。

 さて、プログラミングといえばまず変数を扱うことが肝要である。Schemeでは、変数を定義するには「define」というキーワードを使う。次のコードを実行すると「2」が表示され、aの値が2になっていることを確認できる。

(define a 2)
a

 同様にしてaにリストを定義してみよう。

(define a '(1 2 3))
a

 「(1 2 3)」の前に「’」が付いていることに気付いただろうか。これは「クォート」と呼ばれるものだ。プログラム中で単に「(1 2 3)」と書いてしまうと、リストの第1要素である「1」を演算子や関数とみなして実行しようとしてしまい、エラーになる。クォートはそうした実行を止めるための記号だ。かっこの前に付けると、プログラムではなくリストとみなされるようになる。

 今度はプログラムとしても実行できるリストをaに定義してみよう。

(define a '(+ 1 1))
a

 プログラムとして実行されるのではなく、aが「(+ 1 1)」というリストになるのを確認できた。

 このリストをプログラムとして実行するにはどうすればいいだろうか。それには「eval」を使う。

(define a '(+ 1 1))
(eval a (scheme-report-environment 5))

 これを実行すると、aのリストがプログラムとして実行され、結果は「2」になる。ちなみにevalの第2引数の「(scheme-report-environment 5)」はR5RSで定められているものだ。ただの決まりなので、あまり気にする必要はない。