module - lambda 表达式内部和外部的 let 之间的区别

标签 module scheme read-eval-print-loop lexical-scope guile

考虑一个具有以下过程的模块:

(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>
$1 = #t
scheme@(guile-user)> (proc2)
#<directory (guile-user) 562a05b8bbd0>
$2 = #t
scheme@(guile-user)> (proc3)
#<directory (guile-user) 562a05b8bbd0>
$3 = #t

仅在 proc1 中,lambda 表达式内的 module 符号才会绑定(bind)到定义过程的模块。

有人能解释一下吗?这是否意味着如果我想创建一个闭包,我总是必须使用第一种形式?

最佳答案

proc1 仅在定义过程时对 (current-module) 求值一次,因此 lambda 内的 module 绑定(bind)到该值在定义时。

proc2 在调用该过程之前不会评估 (current-module)
它还每次都会对其进行评估。
它相当于proc3

关于module - lambda 表达式内部和外部的 let 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56316118/

相关文章:

emacs - 控制台 emacs 上的 REPL

user-interface - 如何设计可移植模块化GUI应用程序?

scheme - 在 Windows 7 上运行 MIT Scheme 时出现 "Requested allocation is too large"错误

scheme - 帮助解释 Scheme 中的 `cons` 如何工作?

functional-programming - 函数式编程的入门教材是什么?

android - 如何在 REPL 中运行 android 代码

Clojure:如何判断代码是在 REPL 还是 JAR 中运行?

python - 如何使用三个使用公共(public)模块的应用程序构建一个 python 项目

module - 如何在一个模块中拥有多个文件?

haskell - 有一个干净的导入 block 的方法? (重新导出模块?每行多个导入?)