如何解决方案 - 动态范围 - 为什么这是返回值?
为什么在动态范围内,此代码会为“g 未定义”返回错误? 在运行 ((ff) 5) 时,在某个时刻 g 将获得一个值(f lambda)并将其插入到运行时堆栈中。
(
let ((f (lambda (g)
(lambda (n)
(if (zero? n)
1
(* n ((g g) (- n 1))))))))
((f f) 5)
)
解决方法
动态作用域没有闭包。例如。
(define val #f)
(define (get-val val)
(lambda ()
val))
(define getter (get-val 5))
(getter) ; => #f
来自 val
的词法范围 get-val
作为自由变量存在于返回的过程中,并将返回 5
,但在动态范围中,它在返回过程后立即停止存在。过程中引用的 val
是动态范围内的任何绑定 val
。例如。
(let ((val 10))
(getter)) ; ==> 10
因此,val
中的 let
成为与该名称最接近的绑定,广告 getter
返回了该名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。