基本的には、eqv? も eq? も equal? も、両者が同じ型でないと #f を返します。
また、数や boolean や symbolに対しては、
同じ値の時 #t を返します。
eq?,eqv? が、equal? と大きく異なる点は、前者がリスト構造
などについて、同じ object を指している場合のみ #t を返すのに対して、
後者は、構造が同じであれば #t を返す点です。
ちなみに、cdr は "could-er" と発音するそうです。
cadr や caddr や cdar をどう発音するのか知っている人は僕に教えて下さい。
*: 但し、値があればの話ですが。
つまり、 do-something が無限ループなどで停止しない場合は、
式変換によって動かないプログラムが動くようになってしまいます。
> `((+ 1 2) ,(+ 1 2) (+ 1 2))
((+ 1 2) 3 (+ 1 2))
実は、 list と ' をつかえば同じことが出来ます。
どちらを指定するかの違いだけです。
> (list '(+ 1 2) (+ 1 2) '(+ 1 2))
((+ 1 2) 3 (+ 1 2))
R5RS 情報はこちら
(let ((x '(#t (1 2))))
(let ((p (do-something x)))
(if (car x)
3
p)))
まず、x にリストを作り、さらに良く知らない関数 do-something を呼んでいます。
もし、仮に変数、リスト構造への代入が一切ない世界であれば、
このプログラムを以下のように変更しても式の値は変わらないことになります
*。
(let ((x '(#t (1 2)))) ; x が 変わらないことを利用
(let ((p (do-something x)))
(if #t
3
p)))
==> ; (if 文を簡略)
(let ((x '(#t (1 2))))
(let ((p (do-something x)))
3))
==> ; (do-something x) が外界に影響を与えることはない*。
(let ((x '(#t (1 2)))) 3)
==> ; x 使う人がいなくなった。
3
実は、Scheme においては代入はありますのでこのような事はできませんが、
関数型の性質としては、このような効果が期待できることになります。
99.10.6/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp