Я пытаюсь интерпретировать лямбда в схеме. Вот мой код:Получение ошибки при интерпретации лямбда в схеме
(define get-operator (lambda (op-symbol)
(cond
((equal? op-symbol '+) +)
((equal? op-symbol '-) -)
((equal? op-symbol '*) *)
((equal? op-symbol '/) /)
(else (error "interpret: operator not implemented -->" op-symbol)))))
(define (apply-lambda clos actuals)
(let* ((lam (cadr clos))
(def-env (caddr clos))
(formals (cadr lam))
(body (caddr lam))
(new-env (bind-all formals actuals def-env)))
(val-body new-env)))
(define interpret (lambda (e env)
(cond
((number? e) e)
((symbol? e) (get-value e env))
((not (list? e)) (error "interpret: cannot evaluate -->" e))
((if-stmt? e) (if (eq? (cadr e) 0)
(interpret (cadddr e) env)
(interpret (caddr e) env)))
((let-stmt? e) ;;GoZoner's part of code
(let ((names (map car (cadr e)))
(inits (map cadr (cadr e))))
;; Evaluate inits in env
(let ((vals (map (lambda (init) (interpret init env)) inits)))
;; Extend env with names+vals
(let ((new-env (append (map cons names vals) env)))
;; Eval body in new env
(interpret (caddr e) new-env)))))
((lambda-stmt? e) (apply-lambda e env))
(else
(let ((operands (map interpret (cdr e) (make-list (length (cdr e)) env)))
(operator (get-operator (car e))))
(apply operator operands))))))
При попытке входа ((lambda (n) (+ n 2)) 5)
, я получаю сообщение об ошибке сказав «Объект ()
, передается в качестве аргумента safe-car
не пара». Почему это так? Я уверен, что функция lambda-stmt?
работает хорошо, поэтому я не писал ее здесь, что-то не так с интерпретацией apply-lambda
, но я не могу ее найти.
Вы можете редактировать код выше, чтобы сказать «;; Код GoZoner 'прямо после '(let-stmt? E)'? – GoZoner
Является ли ваше использование 'lambda' вызовом функции? Или вы ожидаете обработать что-то вроде '(let ((func (lambda ...))) (func ...))' – GoZoner
Я пытаюсь реализовать -> (лямбда () ), -> НОМЕР | IDENT | | | | | , -> (let () ), -> (IDENT ) | (IDENT ), -> IDENT | IDENT –