-1

eval1関数とを書きますapply1

eval1連想リスト (キーはSymbolで、値はNum ) と算術式を使用して、変数名を値に一致させます。

apply1記号 ('+ または ')、式のリスト、連想リストを消費し、記号で指定された関数をリスト内の式に適用した結果の数値を計算します。

例:

(check-expect (eval1 '((x 2) (y 3) (z 4)) '(+ x (* y 2))) 8)
(check-expect (apply1 '* '(a (+ 3 b)) '((a 2) (b 1))) 8)

PS:相互再帰的である必要がありますeval1apply1

4

1 に答える 1

1

このような:

(define (eval1 env exp)
  (cond ((number? exp) exp)
        ((symbol? exp)
         (cond ((assq exp env) => cadr)
               (else 'unbound-variable)))
        ((list? exp)
         (let ((operator (car exp))
               (operands (cdr exp)))
           (apply1 operator operands env)))))

(define (apply1 operator operands env)
  (case operator
    ((+) (+ (eval1 env (list-ref operands 0))
            (eval1 env (list-ref operands 1))))
    ((*) (* (eval1 env (list-ref operands 0))
            (eval1 env (list-ref operands 1))))
    (else 'unknown-operator)))

認識しておくべき重要なことは、式をどのように評価するかは、式の性質に依存するということです。数値/リテラル​​の場合は、数値/リテラル​​を返すだけです。シンボルの場合は、環境内の値を検索します。リストの場合は、評価された引数に演算子を適用します。

于 2013-03-19T06:01:26.263 に答える