提问人:Isaac 提问时间:2/10/2020 最后编辑:Will NessIsaac 更新时间:2/10/2020 访问量:236
递归调用的变量是自由的还是有约束的?
Will recursively-called variable be free or bound?
问:
我试图更好地理解自由变量和约束变量。下面是一个示例代码:
(define (what-kind-of-var? guess x)
(< (abs (- (square guess) x))
0.001))
我看到这里的绑定变量是 和 ,自由变量 、 、 和 。如果我递归调用会怎样?它会是一个绑定变量,因为它本身是绑定的吗?guess
x
<
abs
-
square
what-kind-of-var?
谢谢!
答:
0赞
Atharva Shukla
2/10/2020
#1
guess
和 是参数。当应用函数时,它们最终会绑定(到相应的参数)。x
<
、 、 、 实际上绑定到初始环境中的过程。所以它们不是自由变量。abs
-
square
将是自由变量,但受制于其作用域中未定义的事实。(请注意,在初始环境中绑定)。what-kind-of-var?
sqr
what-kind-of-var?
也不是未绑定的,即使它以递归方式调用自身(假设递归在语言中正确实现)。 可以看作是(define (f param) body)
(define f (lambda (param) body)
评论
4赞
amalloy
2/10/2020
当然,他们在这个表达方式上是自由的。他们可能被束缚在全球环境中,但在这个表达中,他们是自由的。
0赞
Atharva Shukla
2/12/2020
是的,我假设该函数将在编辑器中输入出来。但是,如果我们只考虑这种表达方式,那么,是的,它们是免费的。
0赞
Will Ness
2/10/2020
#2
在动态绑定下,它会,但 Scheme 具有词法范围。
但实际上两者都不是。“Free”或“bound”来自lambda演算。 是一个顶级变量,将该 lambda 表达式命名为what-kind-of-var?
(define what-kind-of-var?
(lambda (guess x) ;; this
(< (abs (- (square guess) x))
0.001)))
但在 lambda 演算中,表达式不能命名。在 lambda 演算中以递归方式调用它的唯一方法是使用 Y 组合器:
((Y (lambda (what-kind-of-var?) ;; outer
(lambda (guess x) ;; inner
(if (< (abs (- (square guess) x))
0.001)
guess
(what-kind-of-var? (+ 1 guess) x)))))
4 25)
现在当然绑定在 下的新 lambda 表达式中。它在嵌套的内部 lambda 中是自由的,但在外部 lambda 中是绑定的。what-kind-of-var?
Y
评论
0赞
alinsoar
2/10/2020
R7RS 的动态绑定也 srfi.schemers.org/srfi-39/srfi-39.html
0赞
alinsoar
2/10/2020
我认为自由和束缚的思想也出现在弗雷格的作品中(大约 1880 年?Lambda 演算精确地定义了它们,但它们肯定以前出现过。
0赞
Will Ness
2/10/2020
A.不是语言本身,而是作为扩展。B. 我们在 Scheme 中,所以 LC 是相关的。当然,LC本身是“开放公式”概念(即具有自由变量的逻辑公式)的发展
0赞
alinsoar
2/10/2020
动态绑定现在是标准化的,按照我粘贴的实现请求。默认情况下,新版本的 scheme 将包含在其内核中。
0赞
alinsoar
2/10/2020
bitbucket.org/cowan/r7rs-wg1-infra/src/default/R7RSHomePage.md
评论