SICP 読み (302) 5.4 積極制御評価器
なんか今年も残り少なくなってきた。残り 1 節ですが終了にはほど遠い。読了ベースで良いのであれば間に合わないこともないのでしょうが、この辺はあまり気にせず進めましょうね。
問題 5.30 の b.
昨晩は各方面に感謝を意を表しつつ力尽きました。又の名を現実トウヒと言うのだろうか。(こら
# しかもその後、iKnow にもニゲてたり (を
(300) なエントリを見つつ、検討。
続き
ささっと car と cdr だけ盛り込んでみた。ch5-eceval.scm の primitive-apply
primitive-apply (assign val (op apply-primitive-procedure) (reg proc) (reg argl)) (test (op eq?) (reg val) (const pair-required)) (branch (label signal-error)) (restore continue) (goto (reg continue))
あと、eceval-operations も以下 (一部のみ)
(define eceval-operations (list ;;primitive Scheme operations (list 'read read) (list 'eq? eq?)
あるいは、ch5-eceval-support.scm の修正、追加分を以下に
(define (primitive-procedure-objects) (map (lambda (proc) (list 'primitive (car proc) (cadr proc))) primitive-procedures)) (define (primitive-implementation proc) (caddr proc)) (define (primitive-procedure-name proc) (cadr proc)) (define (apply-primitive-procedure proc args) (let ((ret (check-args (primitive-procedure-name proc) args))) (if (null? ret) (apply-in-underlying-scheme (primitive-implementation proc) args) (car ret)))) (define (check-args proc-name args) (cond ((or (eq? proc-name 'car) (eq? proc-name 'cdr)) (cond ((not (pair? (car args))) (list 'pair-required)) ((not (= 1 (length args))) (list 'wrong-number-argiments)) (else '()))) (else '())))
微妙。一応
;;; EC-Eval input: (car '(1 2) '(3 4)) (total-pushes = 8 maximum-depth = 5) ;;; EC-Eval value: wrong-number-argiments ;;; EC-Eval input: (car 1) pair-required ;;; EC-Eval input: (cdr 1) pair-required ;;; EC-Eval input: (cdr '(1 2) 3) (total-pushes = 8 maximum-depth = 5) ;;; EC-Eval value: wrong-number-argiments ;;; EC-Eval input: (car '(1 2)) (total-pushes = 5 maximum-depth = 3) ;;; EC-Eval value: 1 ;;; EC-Eval input: (cdr '(1 2)) (total-pushes = 5 maximum-depth = 3) ;;; EC-Eval value: (2) ;;; EC-Eval input:
みたいなカンジで掴まえることができては、います。なんかテキトーでスミマセン。