次のような S 式 の集合 expression を考える。つまり、
*, +, <, =, > 演算と数字と if だけの簡単な Scheme 式の形をした S 式である。
expression ::= number | #t | #f
| (if expression expression expression)
| (procedure expressions)
expressions ::= null-expression | expression expressions
null-expression ::=
procedure ::= primitive-procedure
primitive-procedure ::= + | * | < | = | >
この評価器を作ることを考える。
とりあえず、以下の部分を作ったので、これを参考に評価器を完成させよ。
(define primitive-procedure-names '(* + - / < = >)) ; primitive-procedure の名前
(define (primitive-procedure? procedure) ; primitive-procedure かの判断
(and (symbol? procedure)
(member procedure primitive-procedure-names)))
(define (primitive-procedure-to-scheme-primitive procedure)
(cond ((eq? procedure '+) +) ; 各 primitive-procedure (名前)に
((eq? procedure '*) *) ; 対応する Scheme の関数
((eq? procedure '-) -)
((eq? procedure '/) /)
((eq? procedure '<) <)
((eq? procedure '=) =)
((eq? procedure '>) >)))
;;;
;;; evaluator 本体
;;;
(define (eval-expr expr)
(cond ((prim-expr? expr) expr)
((if-expr? expr)
(eval-if (cond-expr expr) (then-expr expr) (else-expr expr)))
((application? expr)
(apply-proc (operator expr)
(eval-arguments (operands expr))))
(else (display expr)
(error "Unknow Expression :: eval-expr"))))
;;; apply 本体
(define (apply-proc procedure arguments)
(cond ((primitive-procedure? procedure)
(apply-primitive-procedure procedure arguments))
(else (display procedure)
(error "Unknow Procedure :: apply-proc"))))
解答例