2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面获取更多关于如何使用本站的信息。

0
Clojure
我确信“内置”可能不是这里正确的术语,但我不知道这些是什么。

今天我在修复clojail的bug时遇到了这个问题。内置变量,尤其是以下没有源链接的列表中的变量: 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 "A java.io.Writer object representing standard error for print operations.\n\n  Defaults to System/err, wrapped in a PrintWriter"}
user=> (meta #'*in*)
{:ns #<Namespace clojure.core>, :name *in*, :added "1.0", :doc "A java.io.Reader object representing standard input for read operations.\n\n  Defaults to System/in, wrapped in a LineNumberingPushbackReader"}
user=> (meta #'*out*)
{:ns #<Namespace clojure.core>, :name *out*, :added "1.0", :doc "A java.io.Writer object representing standard output for print operations.\n\n  Defaults to System/out, wrapped in an OutputStreamWriter", :tag java.io.Writer}
user=> (meta #'*ns*)
{:ns #<Namespace clojure.core>, :name *ns*, :added "1.0", :doc "A clojure.lang.Namespace object representing the current namespace.", :tag clojure.lang.Namespace}

5 个答案

0

评论由:[email protected] 提出

用户列表上最近关于这个讨论似乎很相关:(链接:http://groups.google.com/group/clojure/browse_thread/thread/d5efd00c699f73a7 文本:应遵循:dynamic?)

似乎归结为以下信息:关于一个 Var 是动态(或不是)的重复。一次是在 metadata 中,键为 {{:dynamic}},一次是在实现 Clojure 的变量的 Var 类的布尔字段中。可以通过调用 Var 的 {{isDynamic()}} 方法获得此布尔值。

混淆之所以出现,是因为显然 {{:dynamic}} 和 {{.isDynamic}} 可能会彼此不同步。在这种情况下,{{.isDynamic}} 是真相的源头。

0
_评论者:[email protected]_

{{Compiler$Parser.parse(...)}} 在符号的元数据中发现{{:dynamic}}条目,由{{LispReader}}留下,并在创建新的{{DefExpr}}时传递它,这反过来又生成了将在运行时调用{{setDynamic(...)}}的代码。

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

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

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

或者,也许可以考虑,从1.4开始完全替换{{:dynamic}},并仅强制执行既定的命名约定:{{\*earmuffs\*}}是动态的,{{ everything-else }}不是。(在1.3中,编译器会警告违反此约定的违规行为。)
0

评论者:jafingerhut

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

0

评论者:jafingerhut

啊。在我的前一个评论中,通过“几行这样的代码”,我指的是粘贴以下示例

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

0
引用:[https://clojure.atlassian.net/browse/CLJ-859](https://clojure.atlassian.net/browse/CLJ-859)(由 alex+import 报告)
...