如何在Scheme中正确找到链表的元素?

时间:2011-11-02 01:57:06

标签: scheme

我想评估以下内容:(eval-expr '(times x x) '((x ((plus y x) ((x 2) (y 3))))))

这是使用方案的懒惰评估。我一直收到以下错误:

mcar: expects argument of type ; given 3

总体答案是25,但你必须通过获取(plus y x)的值并将其分配给环境的头部来做到这一点。 (plus y x)是上述表达式的caadr,环境是cadadr。我不确定我做错了什么,代码看起来是正确的。

第4行处理这种情况。

(define (eval-expr E env)
  (cond
   ((eqv? (car E) 'plus) (apply + (eval-params (cdr E) env)))
   ((eqv? (car E) 'times) (apply * (eval-params (cdr E) env)))
   ((eqv? (car E) 'divide) (apply / (eval-params (cdr E) env)))
   ((eqv? (car E) 'minus) (apply - (eval-params (cdr E) env)))
   (else '()))) ;  confused - return  ()

(define (eval-params E env)
  (if (null? E) '()
      (cons (eval-expr (car E) env)
            (eval-params (cdr E) env))))

1 个答案:

答案 0 :(得分:2)

根据您的评论,看起来您正在实施一种惰性语言,其中环境包含承诺,并且在评估承诺时,您应该改变环境以包含新值。

我的建议:设计一些辅助功能。第一个:接受表示变量名称和环境的符号的函数,并返回该变量的值,其副作用是改变环境以包含更新的绑定。在这种情况下,你可能想要另一个辅助函数接受单个绑定,评估它的右侧,然后改变它以包含新值。

请务必彻底 TEST 这些辅助功能。