SICP 読み (138) 4.1.2 式の表現
どう読み進めれば良いのか思案中。この節の範疇は試験すべきかなぁ、とか。
とりあえず机上ベースなそれを以下にたれ流してみる。
問題 4.2
まず a. ですが、eval が以下のようになるとして
(define (eval exp env) (cond ((application? exp) (apply (eval (operator exp) env) (list-of-values (operands exp) env))) ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ;; 以下略
最初ループするのか、と思っていました。ってか決めつけてた。(を
ループはしないけど、error になるのかな。例えば
(define x 3)
を評価しようとしても、とりあえず application と評価されてしまって definition とは判断されないので駄目、って言ってしまって良いのだろうか。
もう少し具体的に書くと
- application と評価されて define のみが eval に渡される
- pair? ではないので error になる
という事でしょうか。
次、b. について。eval の実装は a. みたいな感じ。application? の実装が以下のようになっていれば OK と見てるんですがダウト??
(define (application? exp) (tagged-list? exp 'call))
あ、違うな。operator と operands が以下ですか??
# あまり検証してません。
(define (operator exp) (cadr exp)) (define (operands exp) (cddr exp))
うーん。適当スギかも。(を
問題 4.3
これは検討途中です。eval をどう書いたものやら。以下は下書き。
(define (eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) (else (let ((x (and (pair? exp) (get (car exp) 'eval)))) (if x (x exp env) (apply (eval (operator exp) env) (list-of-values (operands exp) env)))))))
これだと eval で error は出なくなっちゃうんだよねぇ。てーか、else 以下が微妙。どっちかというと
(if (not x) (apply
みたいな方が良いのか。let も微妙。ただ、self-evaluating? と variable? が false だったら基本的には pair? は true でないとダウトっぽい。
なら以下で良いのかなぁ。
(define (eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((not (pair? exp)) (error "Unknown expression type -- EVAL" exp)) (else (let ((x (get (car exp) 'eval))) (if x (x exp env) (apply (eval (operator exp) env) (list-of-values (operands exp) env)))))))
まだ、ぱっと見微妙。
ってか
大体、考え方がセイフなのか、を例示されているソレ達を試験する事で確認した方が良いな。机上とマシンなバランスがナニ。