请在2024 年 Clojure 状态调查!分享您的想法。

欢迎!请查看关于页面以了解更多关于如何使用本网站的信息。

0
Clojure
我确定'内置'可能不是这里正确的术语,但我不知道这些应该怎么称呼。

今天早些时候,我在修复 clojail 中的一个错误时遇到了这个问题。内置变量(特别是以下没有源链接的列出来的):http://clojure.github.com/clojure/clojure.core-api.html, 虽然是动态的,但没有 :dynamic 元数据。这些包括 \*in\*, \*out\*, 和 \*err\* 等等。以下是一些示例


user=> (meta #'*err*)
{:ns #<Namespace clojure.core>, :name *err*, :added "1.0", :doc "代表打印操作的标准的 java.io.Writer 对象。\n\n 默认为 System/err,封装在一个 PrintWriter 中"}
user=> (meta #'*in*)
{:ns #<Namespace clojure.core>, :name *in*, :added "1.0", :doc "表示读取操作的标准输入的 java.io.Reader 对象。\n\n 默认为 System/in,封装在一个 LineNumberingPushbackReader 中"}
user=> (meta #'*out*)
{:ns #<Namespace clojure.core>, :name *out*, :added "1.0", :doc "代表打印操作的标准的 java.io.Writer 对象。\n\n 默认为 System/out,封装在一个 OutputStreamWriter 中", :tag java.io.Writer}
user=> (meta #'*ns*)
{:ns #<Namespace clojure.core>, :name *ns*, :added "1.0", :doc "表示当前命名空间的一个 clojure.lang.Namespace 对象。", :tag clojure.lang.Namespace}

5 个回答

0

评论由:[email protected] 提出

此用户列表中的最近讨论似乎相关:(链接:http://groups.google.com/group/clojure/browse_thread/thread/d5efd00c699f73a7 文本:Should intern obey :dynamic?)

这归结为这样一个信息:一个 Var 是动态的还是静态的信息被重复了。一次作为关键为 {{:dynamic}} 的元数据,另一次则作为实现 Clojure 变量的 Var 类的布尔字段。可以通过调用 Var 的 {{isDynamic()}} 方法来获取这个布尔值。

困惑产生于 {{:dynamic}} 和 {{.isDynamic}} 似乎出现不一致。在这种情况下,{{.isDynamic}} 是真理的来源。

0
答对了
评论者:[email protected]

{{Compiler$Parser.parse(...)}}通过{{LispReader}}在符号的元数据中找到{{:dynamic}}条目,并在创建新的{{DefExpr}}时将其传递,这反过来会生成在运行时创建变量时调用{{setDynamic(...)}}的代码。

据我所知,一旦发生这种情况,{{:dynamic}}条目似乎就无关紧要了。它似乎只是作为与编译器(通过读取器)通信的一种方式实现。一旦编译器收到消息,它就不再需要了。保留它似乎只会引起混淆。

Clojure核心Java层创建的动态变量不使用{{:dynamic}}机制,它们直接{{setDynamic()}}。这就是为什么它们在元数据映射中没有{{:dynamic}}的原因。

- 可能编译器应该从运行时提供的元数据映射中省略{{:dynamic}},因为它的用途已经完成。
- 可能Clojure应该提供函数{{dynamic?}}。
(defn dynamic? [^clojure.lang.Var v] (.isDynamic v))

或者,也许可以考虑,对于1.4版本,完全替换{{:dynamic}},并仅强制执行既定的命名约定:{{\*earmuffs\*}}是动态的,{{一切其他东西}}都不是。(在1.3中,编译器会警告违反此约定的违规行为。)
0
答对了

评论者:jafingerhut

我最近注意到core.clj中的几行代码像这样。根据这样的符号有多少个,也许可以使用这种方法向核心符号添加:dynamic元数据,并附带一个单元测试来验证核心中所有符号的:dynamic只有在.isDynamic返回true时才出现。

0
答对了

评论者:jafingerhut

呃。在我之前的评论中,通过“像这样的几行代码”,我是指以下内容作为示例:

(alter-meta! #'agent assoc :added "1.0")

0
答对了
参考:https://clojure.atlassian.net/browse/CLJ-859(由alex+import报告)
...