HOME | 2. Scheme を電卓代わりに使う | もうひとつの Scheme 入門 | 4. 関数を定義しよう | 書き込む |
ここでは基本的な関数である cons, car, cdr, list および quote について説明します。
> (cons 1 2)
(1 . 2)
(1 . 2) と表示されます。
cons は図1に示すように
アドレスが 2 つ分入るメモリー領域を確保し、片方に 1 へのアドレスを、もう片方に 2 へのアドレスを入れます。
1 へのアドレスが入っている方を car 部、 2 へのアドレスが入っている方を
cdr
部と呼びます。
car は Contents of the Address part of the Register の略で、一方、
cdr は Contents of the Decrement part of the Register の略です。
これは、Lisp が実装された初期のハードウェアのメモリーの部位の名前です。
このことからコンスセルの実態がメモリー領域であることが伺えます。
ちなみに、cons は構成するという意味の英単語 construct の略です。
コンスセルは 数珠つなぎにすることができます。
> (cons 3 (cons 1 2))
(3 1 . 2)
(3 1 . 2) というのは (3 . (1 . 2)) の省略形です。
このとき、メモリーは図2の様になっています。
また、違う種類のデータを組み合わせることもできますし、入れ子にすることもできます。
> (cons #\a (cons 3 "hello")) (#\a 3 . "hello") > (cons (cons 0 1) (cons 2 3)) ((0 . 1) 2 . 3)このようなことができるのは、Scheme が全てのデータをアドレスで管理しているからです。 ちなみに #\c は c という文字を表します。 例えば #\a は a という文字を表します。
実はリストは再帰的に以下の様に定義されます。
例えば、(+ 2 3) は評価されると 5 になりますが、(quote (+ 2 3)) とすれば (+ 2 3) そのものを プログラムに与えることができます。quote はしばしば使われるので ' で代用されます。 つまり、'(+ 2 3) は (+ 2 3) というリストを表します。 リテラル(ソースコードにそのまま書く値)としてリストを作るときは quote を使います。
quote はリストだけでなく、シンボルの 評価も止めます。例えば '+ は + というシンボルそのものを指します。
実は '() は空リスト () を quoate したものです。 従って、入力するときには '() を使いますが、処理系から空リストが表示されるときは () が使われます。
> (car '(1 2 3 4)) 1 > (cdr '(1 2 3 4)) (2 3 4)
> (list) () > (list 1) (1) > (list '(1 2) '(3 4)) ((1 2) (3 4)) > (list 0) (0) > (list 1 2) (1 2)
;1 > (cons "hi" "everybody") ("hi" . "everybody") ;2 > (cons 0 '()) (0) ;3 > (cons 1 (cons 10 100)) (1 10 . 100) ;4 > (cons 1 (cons 10 (cons 100 '()))) (1 10 100) ;5 > (cons #\I (cons "saw" (cons 3 (cons "girls" '())))) (#\I "saw" 3 "girls") ;6 > (cons "Sum of" (cons (cons 1 (cons 2 (cons 3 (cons 4 '())))) (cons "is" (cons 10 '())))) ("Sum of" (1 2 3 4) "is" 10)
;1 > (car '(0)) 0 ;2 > (cdr '(0)) () ;3 > (car '((1 2 3) (4 5 6))) (1 2 3) ;4 > (cdr '(1 2 3 . 4)) (2 3 . 4) ;5 > (cdr (cons 3 (cons 2 (cons 1 '())))) (2 1)
HOME | 2. Scheme を電卓代わりに使う | もうひとつの Scheme 入門 | 4. 関数を定義しよう | 書き込む |