>>42-43
教えてくれてありがとう
どうやら仮引数のドットはScheme固有の書式のようだね
Common LispとEmacs Lispでは(x &rest y)と書くとのことなので改めて質問する
(define a 'b)
(define f (lambda (x &rest y) (cons x y)))
としたとき
(f a a a . a) ってどういう結果になる?
純LISPのバグ取りや修正や整形や手直しの傍ら
evalについても色々自分で考えながらやってんだけど
evalを自分で考えだすのはちょっと難易度高そうだわ
(cons (label a (cons (label b 'xx) (label c 'yy)) (cons (cons a b) c))
みたいなバカみたいなコードあったらどう処理すりゃいいのかとか
そもIBM704でlabelがトップレベルでしか使えない特殊形式だとかいう制限とかありゃ気にならんのだが
仕様は知らんしなあ・・・他の一般LISPとはだいぶ仕様がかけなれてそうだし
(なにせ普及LISP方言にLABELという同様動作をする関数名がないし・・・
論文のをさらっと読んだ感じだと
(eval e a) は
evalの引数を渡す部分のaに変数を追加していって再帰的に呼び出してるくさいので俺もそういう風に再現を考えてんだが
よくよく思えばこの変数の実現方法なら(eval c)という引数ひとつでもできそうな気がしてこなくもない
ていうかこれの実現にlabelを使えば変数をストックしておく変数を用意しとけば足りそうなのに引数として渡してるところを見ると
labelはトップレベルでしか使えないってことなのか、何らかの内側では宣言できないってことなのかな
(label F (lambda (e a) ((cons 'LAMBDA (cons '() (cons (cons e a) ()))))))
(F
'(label subst (lambda (x y z) (cond ((atom z) (cond ((eq y z) x) ((quote t) z))) ((quote t) (cons (subst x y (car z)) (subst x y (cdr z)))))))
'((quote (X Y)) (quote B) (quote (A (B C) A B C)))
)
アカンでえ・・・これはチューリング完全と言えるのか・・・?evalを内包してるだけな感じ・・・?