「通常の」関数は通常、特定の型のオブジェクトのドメインでのみ定義されますが、Scheme の型述語list?
やなどの特定の関数はprocedure?
、任意の型の引数に対して定義され、それ自体に適用することもできます。したがって、たとえば(list? procedure?)
は に評価され#f
、 に(procedure? procedure?)
評価され#t
ます。この種の完全に定義された関数を記述する方法を理解しようとしていますが、これについて議論している情報源を見つけることができませんでした。
たとえば、次のコンストラクタとセレクタを使用して、コンピューター プログラムの構造と解釈の演習 2.4 で説明されているペア データ型を実装するとします。
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
(define (cdr z)
(z (lambda (p q) q)))
を使用して構築されたものとそうでないものpair?
を返す述語を定義するにはどうすればよいでしょうか。より一般的には、型の述語はどのように実装されていますか?#t
cons
#f
list?
procedure?