Схема: почему оценка этой рекурсивной функции, определенной в letrec, не удалась? - PullRequest
2 голосов
/ 18 февраля 2011

Я пишу глупый letrec в Схеме (DrRacket Довольно Большой):

(letrec
    ((is-creative? 
      (lambda (writing)
        (if (null? writing)
            #f
            (is-creative? 
             (eval writing))))))
(is-creative? 
 (quote is-creative?)))

Проверка синтаксиса была в порядке, но запуск не удался с:

reference to undefined identifier: is-creative?

Отладчик говорит вточка сбоя:

is-creative? => #<procedure:is-creative?>

Подскажите, пожалуйста, что мне не хватает?Исправление было бы неплохо, но, пожалуйста, без определений, хотя и не обязательно.

Спасибо!

1 Ответ

2 голосов
/ 18 февраля 2011

Eval не видит локальные переменные. В сфере, где работает eval, есть креатив? связан как локальная переменная, но, поскольку он находится внутри (letrec), а не после него, он еще не был связан в глобальной области видимости. Смотрите документацию по eval, в которой обсуждается это:

http://docs.racket -lang.org / гид / eval.html

Я не думаю, что вы можете делать то, что пытаетесь сделать с помощью eval. Я не знаю причину, по которой вы пытаетесь это сделать, поэтому мне сложно предложить альтернативу. Вы можете вместо этого попробовать (применить).

...