eq?

関数 eq? は2つの引数を取り、同じものならば真(#t)を返す。

gosh> (eq? 'Harry 'Harry)
#t
gosh> (eq? 'margarine 'butter)
#f

本文には、2つの引数について「両方とも数でないアトムです。」とあるけど、脚注には「実際、eq? の引数にリストがきてもかまいません。」、「実際、eq? の引数に数がきてもかまいません。」とある。なんか、こういう例外というか本文と違うのが多いな。何なんだろ。

gosh> (eq? '(a b c) '(a b c))
#f

ふむ、引数がリストの場合は、同じリストでも偽(#f)になるな。
数ではどうだろう。

gosh> (eq? 7 7)
#t
gosh> (eq? 1 4)
#f

引数が数の場合は、同じ数なら真(#t)になった。

Eq? の掟
関数 eq? は2つの引数を取る。
どちらも数でないアトムでなければならない。

atom?

関数 atom? は任意のS式を引数に取り、それがアトムであるとき真(#t)を返す。といっても Gauche に atom? は用意されていないので、まずは脚注にある定義を写経。

gosh> (define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))
atom?

関数の定義の仕方は、本文で触れていないのでここでも触れない。そのうち出てくるだろう。

さあ、試してみよう。

gosh> (atom? 'Harry)
#t
gosh> (atom? '(Harry had a heap of apples))
#f
gosh> (atom? (car '(Harry had a heap of apples)))
#t
gosh> (atom? (cdr '(Harry had a heap of apples)))
#f
gosh> (atom? (cdr '(Harry)))
#f

最後の例では、(cdr '(Harry)) が 空リストなので偽(#f)なのだな。

null?

関数 null? は引数が空リストのとき真(#t)を返す。

gosh> (null? '())
#t
gosh> (null? (quote ()))
#t
gosh> (null? '(a b c))
#f

(quote ())'() の別の書き方。最後の例では、引数が空リストでないので偽(#f)が返ってきている。

本文には「アトムの null? をたずねることはできません」とあるけど、脚注には「実際、(null? α) は空リスト以外はすべて偽になります。」とある。

gosh> (null? 'spaghetti)
#f

Null? の掟
関数 null? はリストに対してのみ定義される。

cons

関数 cons は任意のS式をリストの先頭に付け加える。

gosh> (cons 'peanut '(butter and jelly))
(peanut butter and jelly)
gosh> (cons '(banana and) '(peanut butter and jelly))
((banana and) peanut butter and jelly)

cons は2つの引数をとり、ひとつ目は任意のS式、ふたつ目はリストでなければならない。

gosh> (cons 'a 'b)
(a . b)

あれ、エラーにならないな。リストともちょっと違う。なんだかわからないけど、そのうち出てくるだろう。それまでは保留。
脚注には、「実際、(cons α β) はすべての値αとβにうまく働いて、(car (cons α β))=α、(cdr (cons α β))=β となります。」とある。

gosh> (car (cons 'a 'b))
a
gosh> (cdr (cons 'a 'b))
b

Cons の掟
関数 cons は2つの引数を取る。
cons の第2引数はリストでなければならない。
結果はリストとなる。

carとcdr

car

関数 car はリストの中の最初のS式を返す。

gosh> (car '(a b c))
a
gosh> (car '((a b c) x y z))
(a b c)

アトムや空リストに適用するとエラーになる。

gosh> (car 'atom)
*** ERROR: pair required, but got atom
Stack Trace:
_______________________________________
gosh> (car '())
*** ERROR: pair required, but got ()
Stack Trace:
_______________________________________

Car の掟
関数 car は空でないリストに対してのみ定義される。

cdr

関数 cdr (クダーと読む)はリストの中から最初のS式を取り除いた、残りのリストを返す。

gosh> (cdr '(a b c))
(b c)
gosh> (cdr '((a b c) x y z))
(x y z)
gosh> (cdr '(hamburger))
()

S式がひとつしかないリストの場合には、空リストが返ってくるんだな。

アトムや空リストに適用すると、エラーになる。

gosh> (cdr 'atom)
*** ERROR: pair required, but got atom
Stack Trace:
_______________________________________
gosh> (cdr '())
*** ERROR: pair required, but got ()
Stack Trace:
_______________________________________

Cdr の掟
関数 cdr は空でないリストについてのみ定義される。
空でないリストの cdr は常に別のリストになる。