Схема: Почему вычисление этой рекурсивной функции, определенной в letrec, не удается?

Я пишу глупый летрек в Scheme (DrRacket Pretty Big):

(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?>

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

Спасибо!


person Gabriel Ščerbák    schedule 18.02.2011    source источник
comment
Спасибо за исправление форматирования кода!   -  person Gabriel Ščerbák    schedule 18.02.2011
comment
Еще одна вещь, кроме того, что комбинация letrec и eval не работает: я полагаю, что ваше условное выражение должно использовать procedure? вместо null?, иначе вы получите бесконечный цикл, даже если eval будет работать так, как вы ожидали.   -  person Rörd    schedule 19.02.2011
comment
@Rörd: не обращай внимания, так и было задумано, я сказал, что это глупо... на самом деле это план эссе, которое я пишу...   -  person Gabriel Ščerbák    schedule 19.02.2011


Ответы (1)


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

http://docs.racket-lang.org/guide/eval.html

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

person Nate C-K    schedule 18.02.2011
comment
Спасибо, жаль, что решение было бы довольно неприятным:/. - person Gabriel Ščerbák; 18.02.2011
comment
apply не будет работать точно по той же причине, хотя ошибка изменится, потому что apply ожидает процедуру. Моя причина написать это непрактична, я просто хотел функцию, которая будет принимать имя функции, рекурсивно оценивать свое тело, пока ничего не останется. Я знаю, что это не так, но это так близко, как у меня есть. - person Gabriel Ščerbák; 18.02.2011