[ 目次, 前節, 次節, 索引 ]

1.1.1 式



プログラムを始めるにはLispのScheme方言の解釈系を使い, 少し対話してみるのがよい. 計算機の端末の前にいるとしよう. (expression)を入力すると解釈系は応答してその式を評価した(evaluating)結果を表示する.

   入力してみる基本的な式の一つは整数である. (より正確には10進法の整数を表す数字だけを入力する.) Lispに整数

486
を与えると, 解釈系は応答して
486
と印字する.5

   数を表現する式は 基本的な手続き(+*など)を表現する式と組み合せて合成式とし, 数に対するそれらの手続きの作用を表現することが出来る. 例えば:

(+ 137 349)
486


(- 1000 334)
666

(* 5 99)
495


(/ 10 5)
2

(+ 2.7 10)
12.7

   式の並びを かっこで囲んで 手続きの作用を表現する上のような式を組合せ (combinations)という. 並びの左端の要素を 演算子(operator), 他の要素を 被演算子(operands)という. 組合せの 値は演算子が指定する手続きを, 被演算子の値である 引数(arguments)に作用させて得る.

   演算子を被演算子の左に置く書き方を 前置記法(prefix notation)という. 習慣的な数学の書き方とかなり違うので, 初めのうちは混乱するかも知れない. しかし前置記法には多くの利点がある. その一つは次の例のように 任意個の引数をとる手続きを許すことである.

(+ 21 35 12 7)
75

(* 25 4 12)
1200
演算子はいつも左端の要素だし, 組合せ全体はかっこで囲まれているので, 曖昧さはない.

   前置記法の第二の利点は自然の拡張として組合せを 入れ子にする(nested)ことを許す. つまり組合せの要素を組合せとすることが出来る:

(+ (* 3 5) (- 10 6))
19

   Lispの解釈系が評価し得る入れ子の深さや式の全体としての複雑さには(原則として)制限はない.

(+ (* 3 (+ (* 2 4) (+ 3 5))) (+ (- 10 7) 6))
のようなまだ比較的単純な式にでも混乱するのはわれわれ人間の方で, 解釈系は直ちに57と評価する. われわれは長い組合せの被演算子が縦に整列するような 清書系 (pretty print)という書き方に従い
(+ (* 3
      (+ (* 2 4)
         (+ 3 5)))
   (+ (- 10 7)
      6))
のように書いて補助とする. 字下げは式の構造を明瞭に示している.6

   どのような複雑な式に対しても解釈系は常に同じ基本動作を繰り返す: 端末から式を読み込み, その式を評価し, 結果を印字する. このような動作のことを, 解釈系は 読込み-評価-印字ループ(read-eval-print loop)を回るということがある. 特に式の値を印字するよう解釈系に陽に指示する必要のないことを知って欲しい.7


5 本書では利用者が入力したものと解釈系が印字した応答の区別を強調したい時は, 後者を斜体で示す.

6 Lispシステムには式の配置を助ける機能を持つものがある. 特に有用なものには新しい行が始ると自動的に清書様の位置まで字下げするものと, 右かっこを入力すると対応する左かっこが強調されるものの二つがある.

7 Lispはすべての式には値があるという約束に従う. この約束はLispの非効率言語という昔の評判とともに Alan Perlisの「Lispプログラマはすべての値 (value)は知っているが, 価値(cost)は知らない」 (Oscar Wildeのパロディ)の警句につながっている.

[ 目次, 前節, 次節, 索引 ]