Question

I am writing a silly letrec in Scheme (DrRacket Pretty Big):

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

Syntax check was ok, but running it fails with:

reference to undefined identifier: is-creative?

The debugger says at the point of failure that:

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

Can you please tell me what am I missing? Correction would be nice as well, but please no defines, not necessary though.

Thank you!

Was it helpful?

Solution

Eval does not see local variables. In the scope where the eval is running, is-creative? is bound as a local variable but, because it's inside the (letrec) and not after it, it hasn't been bound in the global scope yet. See the documentation for eval, which discusses this:

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

I don't think you can do what you're trying to do with eval. I don't know the reason why you're trying to do it, so it's hard for me to suggest an alternative. You might try using (apply) instead, though.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top