let 内部和外部 lambda 表达式之间的区别
difference between let inside and outside a lambda expression
考虑具有以下过程的模块:
(define-module (test test)
#:export (proc1 proc2 proc3))
(define proc1
(let ((module (current-module)))
(lambda ()
(format #t "~s\n" module))))
(define proc2
(lambda ()
(let ((module (current-module)))
(format #t "~s\n" module))))
(define (proc3)
(let ((module (current-module)))
(format #t "~s\n" module)))
我的印象是所有这些都是等价的,但它们不是。
scheme@(guile-user)> (use-modules (test test))
scheme@(guile-user)> (proc1)
#<directory (test test) 562a062152d0>
= #t
scheme@(guile-user)> (proc2)
#<directory (guile-user) 562a05b8bbd0>
= #t
scheme@(guile-user)> (proc3)
#<directory (guile-user) 562a05b8bbd0>
= #t
仅在 proc1
中,lambda 表达式中的 module
符号绑定到定义过程的模块。
有人可以解释一下吗?这是否意味着如果我想创建一个闭包,我总是必须使用第一种形式?
只有 proc1 打印测试模块。
proc2 和 proc3 是等价的,它们打印 REPL 模块。
以及在 REPL 中执行 proc1,2,3 try (current-module)。它会让事情变得更清楚。
对于 proc1 (current-module) 在定义过程时执行,对于 proc2 和 proc2 (current-module) 在调用过程时执行。
proc1
仅在定义过程时对 (current-module)
求值一次,因此 lambda 内部的 module
绑定到 definition-time 处的值。
proc2
在调用该过程之前不会计算 (current-module)
。
它也每次都评估它。
相当于proc3
.
考虑具有以下过程的模块:
(define-module (test test)
#:export (proc1 proc2 proc3))
(define proc1
(let ((module (current-module)))
(lambda ()
(format #t "~s\n" module))))
(define proc2
(lambda ()
(let ((module (current-module)))
(format #t "~s\n" module))))
(define (proc3)
(let ((module (current-module)))
(format #t "~s\n" module)))
我的印象是所有这些都是等价的,但它们不是。
scheme@(guile-user)> (use-modules (test test))
scheme@(guile-user)> (proc1)
#<directory (test test) 562a062152d0>
= #t
scheme@(guile-user)> (proc2)
#<directory (guile-user) 562a05b8bbd0>
= #t
scheme@(guile-user)> (proc3)
#<directory (guile-user) 562a05b8bbd0>
= #t
仅在 proc1
中,lambda 表达式中的 module
符号绑定到定义过程的模块。
有人可以解释一下吗?这是否意味着如果我想创建一个闭包,我总是必须使用第一种形式?
只有 proc1 打印测试模块。
proc2 和 proc3 是等价的,它们打印 REPL 模块。
以及在 REPL 中执行 proc1,2,3 try (current-module)。它会让事情变得更清楚。
对于 proc1 (current-module) 在定义过程时执行,对于 proc2 和 proc2 (current-module) 在调用过程时执行。
proc1
仅在定义过程时对 (current-module)
求值一次,因此 lambda 内部的 module
绑定到 definition-time 处的值。
proc2
在调用该过程之前不会计算 (current-module)
。
它也每次都评估它。
相当于proc3
.