Что не так с этим калькулятором двух операторов? - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу написать процедуру с именем twoOperatorCalculator, которая будет вычислять операции сложения и вычитания левого ассоциативного инфикса.Операции представлены в виде списка, и результат должен быть результатом этих операций.Ниже приведен пример вывода для этой процедуры:

1 ]=> (twoOperatorCalculator '(1 + 15 − 32/5 + −2))'<br/>
Value : 38/5<br/>

Я так старался, но не смог найти свою ошибку.Ошибка как

1 ]=> (twooperatorcalculator '(1+2-3+2))'

;The object (1+2-3+2) is not applicable.

МОЙ КОД

(define twooperatorcalculator 
  (lambda (exp) (
    (cond
      ((null? exp) 0)
      ((null? (cdr (cdr exp))) (car exp))
      ((eq? #\+ (cadr exp)) (+ (car (exp)) twooperatorcalculator (cdr (cdr exp))))
      ((eq? #\- (cadr exp)) (- (car (exp)) twooperatorcalculator (cdr (cdr exp))))))))

1 Ответ

2 голосов
/ 23 апреля 2019
(exp)

Вы заключаете exp в скобки, что означает, что вы просите переводчика вызвать функцию, в настоящее время связанную с exp.Но exp является списком и не может быть вызван.Вам необходимо удалить скобки.

(... twooperatorcalculator ...)

Сразу после этого в скобках заключено twooperatorcalculator, то есть , а не , что означает, что вы хотите оценить символ.Здесь он будет связан с функциональным объектом, который не имеет смысла для операции +.Вам нужно заключить его в скобки, чтобы вызвать функцию рекурсивно.

...