Symbol と quote


Scheme のデータ構造

今までは データ構造として number, boolean 程度しか扱って来ませんでした。 この回は、他のデータ構造として、Scheme を含めた Lisp の大きな特徴である シンボルやリスト構造 (S 式: S-expressions) について説明をします。

シンボルをデータとしてあつかう

symbol というのは、変数名などにもつかわれている記号のことです。 なぜ変数名と呼ばないかと言うと、 これから symbol それ自身をデータ構造、値として扱おうとしているからです。

まずは、比較のためにも変数名を見てみましょう。

> (define a (+ 1 3))     
> a
4
上の例では、まず a という名前の変数を定義しました。 a を評価しようとすると、その値 4 を返します。 これでは、 symbol を値として用いることが出来ません。

symbol を値として用いるためには、 ' (クォート: quote) を頭につけます。 ' の働きは、次にくる式を評価しないと言うものです。 このため、以下のように symbol を評価しないでそのまま値として用いることが出来ます。

> 'a
a
当然、値として symbol が用いられているときは、"+" 演算などの対象にはなりません。 以下の例の 2 つめでは、"+" が引数の値として、"a" をもらったといって怒っています。
> (+ a 3)
7
> (+ 'a 4)
+: expects type <number> as 1st argument, given: a; other arguments were: 4
symbol を使った program を見てみましょう。 eq?同一性を判断する式です。 一方が symbol であった場合は、他方が同じ symbol であるときのみ #t となります。
(define (my-proper-text-color bgcolor)
  (cond ((eq? bgcolor 'white) 'black)  ; bgcolor は変数 
	((eq? bgcolor 'blue) 'white)   ; (その値がシンボルだったりします)
	((eq? bgcolor 'brown) 'white)
	((eq? bgcolor 'red) 'black)))
---
> (my-proper-text-color 'white)
black
> (my-proper-text-color 'blue)
white

99.10.5/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp