04/11/03 16:51:49
>>914
とりあえずevaluate作ってみたよん。
手元にLispがないからSchemeになってまふ。
オペランドは2つに固定ね(美しくないけど解りやすいから)
(define *operator* `((+ . ,+) (- . ,-) (* . ,*) (expt . ,expt)))
(define evaluate-1
(lambda (op opr1 opr2 a b)
(apply (cdr (assoc op *operator*))
(list
(cond
((eq? opr1 'x) a)
((eq? opr1 'y) b)
(else opr1))
(cond
((eq? opr2 'x) a)
((eq? opr2 'y) b)
(else opr2))))))
(define evaluate
(lambda (expression a b)
(let ((op (car expression))
(opr1 (cadr expression))
(opr2 (caddr expression)))
(evaluate-1 op (if (pair? opr1) (evaluate opr1 a b) opr1) (if (pair? opr2) (evaluate opr2 a b) opr2) a b))))
; (evaluate '(+ 4.1 (- y (* x 2.1))) 2.3 3.3) -> 2.5699999999999994