定理証明手習い (70) lookupからapp-arity?まで
(lookup name defs)
defs
からname
の定義を探す
見つからないときはname
を返す
ちょっと不思議な仕様だけど役に立つのかな
おっとここでvar?
を定義し忘れてることに気づいた
var?
変数かどうか
't
でも'nil
でも数でもなくてアトムなら変数
ということは'()
も変数になっちゃうけど
いいの?
undefined?
未定義かどうか
var?
を使ってるので'()
で試す
> (undefined? '() (list (defun-c 'add '(x y) '(+ x y))))
t
> (undefined? '() (list (defun-c '() '(x y) '(+ x y))))
nil
とりあえず破綻はしてないかなあ
とはいってもこういう使い方はしないよ、ってことでしょうね
Common Lispだったらたぶん結果が違う
(arity? vars es)
リストの要素数が一致しているかどうか
ここから呼ばれてるarity?
は本では定義されてませんでした
やっぱ全ソースは載ってなかったか
j-bob.scmを参照
載ってない分はどれくらいあるのか
(args-arity? def args)
関数の仮引数のリストと実引数のリストの要素数が一致しているかどうか
組み込み関数の面倒も見てくれます
ユーザ定義関数はタグ付きで渡されるけど
組み込み関数は単なるシンボルで渡されるみたいですね
dethm
は仲間はずれ
別扱いにしないとよくないのかな?
数をチェックしたくなることはありそうな気がするけど
(app-arity? defs app)
関数適用の仮引数のリストと実引数のリストの要素数が一致しているかどうか
lookup
が見つけられなかったら名前を返す仕様と
args-arity?
が組み込み関数をシンボルで受け取る仕様はここで生かされてました
組み込み関数はdefs
に含まれてませんのでlookup
は名前を返し、
app-arity?
がそれをそのままargs-arity?
に渡すと
args-arity?
がうまいことやってくれると
ふむふむ