【问题标题】:Strange recursive definition in SchemeScheme中奇怪的递归定义
【发布时间】:2014-12-07 17:03:25
【问题描述】:

考虑以下方案定义:

(define f (lambda () (procedure? f)))

奇怪的是,当我评估(f) 时,我得到#t。问题是:为什么这个评估会终止?我期待它无限循环。鉴于 f 尚未定义,内部 lambda 的计算结果是什么?

【问题讨论】:

    标签: recursion scheme infinite-loop


    【解决方案1】:

    这里不涉及递归。

    当您执行此代码时,会定义一个过程f(未执行):

    > (define f (lambda () (procedure? f)))
    > f
    #<procedure:f>
    

    当你执行它时,它会检查是否有一个与符号 f 相关联的过程,在那个时间点是真的,所以它返回 #t:

    > (f)
    #t
    

    要递归,该过程必须使用(f) 调用自身。

    【讨论】:

    • 我明白了。对我来说,函数的递归定义意味着在其定义中对它的任何引用,而不仅仅是对它的调用。谢谢你的澄清。
    • 现在我想我更了解它了。考虑以下 lambda 表达式: (lambda () (/1 0));值得注意的是,口译员接受了它。我是否应该理解 lambda 表达式从不评估其主体(仅在函数应用程序中评估)?
    • @AlexM。是的。它在调用时进行评估,而不是在定义时进行评估。
    • @AlexM。只需在表达式周围多加一对括号,就会得到除以 0 的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多