Как правильно найти элемент связанного списка в Схеме? - PullRequest
0 голосов
/ 02 ноября 2011

Я хочу оценить следующее: (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 Ответ

2 голосов
/ 03 ноября 2011

Судя по вашим комментариям, создается впечатление, что вы реализуете ленивый язык, в котором среда содержит обещания, а при оценке обещания вы должны изменить среду, чтобы она содержала новое значение.

Моя рекомендация: разработайте пару вспомогательных функций.Во-первых: функция, которая принимает символ, представляющий имя переменной и среду, и возвращает значение этой переменной с побочным эффектом изменения среды для размещения обновленной привязки .В рамках этого вам, вероятно, понадобится другая вспомогательная функция, которая принимает одну привязку, оценивает ее правую часть, а затем изменяет ее, чтобы содержать новое значение.

Обязательно ТЕСТ эти вспомогательные функции полностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...