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)))))))

まだ、ぱっと見微妙。

ってか

大体、考え方がセイフなのか、を例示されているソレ達を試験する事で確認した方が良いな。机上とマシンなバランスがナニ。