【问题标题】:How does Clojure's REPL maintain state?Clojure 的 REPL 如何维护状态?
【发布时间】:2021-12-28 21:55:53
【问题描述】:

我在网上看到Clojure使用ASM库来生成JVM Bytecode,我也看到Clojure有一个REPL。

我假设 REPL 执行的每一行代码都使用 ASM 编译成 Java 类,然后加载该类以执行代码。如果是这种情况,那么每一行都会生成一个新的类文件,所以我不确定在一行上声明的局部变量如何与 REPL 中的后续行共享。

有人知道 Clojure 的 REPL 是如何工作的吗?我尝试阅读 Clojure 源代码,但我对 Clojure 了解不多。

【问题讨论】:

    标签: clojure jvm read-eval-print-loop java-bytecode-asm


    【解决方案1】:

    一次编译的不是“每一行”,而是“每一个表格”。

    在 REPL 中,您总是在某个命名空间中。您可以使用 in-ns 更改 REPL 的当前命名空间。在每个命名空间中,符号(粗略地说,“名称”)和 Vars(粗略地说,一个保存不可变值的容器)之间都有一个绑定。命名空间的“状态”在该命名空间的绑定中。

    例如,如果您在当前命名空间中评估表单 (def a 17),这将为名称 a 创建一个新的(如果它不存在)绑定,该绑定指向包含值的 Var 17。现在,您可以稍后在同一命名空间中评估表单 (+ a 25)。这将在命名空间中获得 a 的值,并将其添加到 25 以返回 42。

    以上是命名空间本地的符号。这些符号可用于该命名空间中评估的所有表单。 (它们也可以从其他命名空间访问,但我暂时不讨论)。

    如果您还没有,可以查看https://clojure.org/reference/evaluation。 https://clojure.org/reference/vars 上的文章也可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-29
      • 2019-09-06
      相关资源
      最近更新 更多