方案:为什么评估letrec中定义的递归函数失败?

时间:2011-02-18 17:23:07

标签: recursion lisp scope scheme letrec

我在Scheme(DrRacket Pretty Big)中写了一个愚蠢的letrec:

(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 个答案:

答案 0 :(得分:2)

Eval没有看到局部变量。在eval运行的范围内,是否具有创造性?绑定为局部变量但是,因为它位于(letrec)内部而不是它之后,它尚未绑定在全局范围内。请参阅eval的文档,其中讨论了这个:

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

我认为你不能做你正在尝试用eval做的事情。我不知道你为什么要这么做,所以我很难提出另一种选择。不过,您可以尝试使用(应用)。