Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure中的动态元数据和实际动态变量之间的断开连接_Clojure - Fatal编程技术网

Clojure中的动态元数据和实际动态变量之间的断开连接

Clojure中的动态元数据和实际动态变量之间的断开连接,clojure,Clojure,我正在学习Clojure,并且正在使用动态范围。我发现了一些事情: 将{:dynamic true}元数据添加到现有Var实际上并不会使Var成为动态的。我可以理解你为什么希望这样,但这可能会误导你 您可以通过(.isDynamic##'whatever) 您可以(但可能不应该?)使用(.setDynamic#'which)更改Var是否是动态的 简言之,Var的动态特性似乎存储在clojure.lang.Var类本身的内部,在def时设置^:dynamic元数据只会影响该内部状态。之后更改

我正在学习Clojure,并且正在使用动态范围。我发现了一些事情:

  • {:dynamic true}
    元数据添加到现有Var实际上并不会使Var成为动态的。我可以理解你为什么希望这样,但这可能会误导你
  • 您可以通过
    (.isDynamic##'whatever)
  • 您可以(但可能不应该?)使用
    (.setDynamic#'which)更改Var是否是动态的
简言之,Var的动态特性似乎存储在clojure.lang.Var类本身的内部,在def时设置
^:dynamic
元数据只会影响该内部状态。之后更改元数据似乎不会影响它。好的

我在查看命名空间clojure.core中的动态变量时发现了这一点。我检查了该名称空间中的哪些变量具有
:dynamic
元数据集:

user=> (def metadyn (map key (filter #(-> % key resolve meta :dynamic) (ns-publics 'clojure.core))))
#'user/metadyn
user=> metadyn
(*3 *2 *print-level* *data-readers* *e *print-length* *1 *verbose-defrecords*
*clojure-version* *default-data-reader-fn* pr)
比我预期的要少,缺少像
*out*
*in*
这样的内容

我查看了哪些变量实际上是动态的:

还有很多

因此,以下变量是动态的,但并不声称在其元数据中:

user=> (clojure.set/difference (set realdyn) (set metadyn))
#{*compile-path* *ns* *allow-unresolved-vars* *unchecked-math* *math-context* *read-eval*
*compile-files* *command-line-args* *warn-on-reflection* *flush-on-newline* *out* *file*
*use-context-classloader* *err* *agent* *print-dup* *print-readably* *fn-loader* *print-meta*
*in* *source-path* *compiler-options* *assert*}
我的问题很简单:这有什么意义吗?我遗漏了什么?或者,这只是Clojure实现中的草率簿记吗


这没有实际用途;只是想了解一下。

您在没有元数据的情况下识别的动态变量是在Java运行时中创建的(请参见第180行开始部分)。在引导使
def
可用(即在core.clj和core_print.clj中)之后,在Clojure中创建其他文件


元数据可以稍后添加,并且在某些情况下是(例如,
*agent*
有一个docstring),因此这不是一个完整的答案。我可以推测,正如您所指出的,由于缺乏实际重要性,因此对用于引导的变量的元数据进行修整的优先级较低。

您确定的没有元数据的动态变量是在Java运行时创建的(参见第180行开始)。在引导使
def
可用(即在core.clj和core_print.clj中)之后,在Clojure中创建其他文件


元数据可以稍后添加,并且在某些情况下是(例如,
*agent*
有一个docstring),因此这不是一个完整的答案。我可以推测,正如您所指出的,由于缺乏实际重要性,因此对用于引导的VAR元数据进行修整的优先级较低。

它们是在def可用之前在运行时创建的。谢谢,对我来说已经足够好了。如果你把它放在回复中,我会把它标记为答案。它们是在def可用之前在运行时创建的。谢谢,对我来说已经足够好了。如果你把它写在回信里,我就把它标为答案。
user=> (clojure.set/difference (set realdyn) (set metadyn))
#{*compile-path* *ns* *allow-unresolved-vars* *unchecked-math* *math-context* *read-eval*
*compile-files* *command-line-args* *warn-on-reflection* *flush-on-newline* *out* *file*
*use-context-classloader* *err* *agent* *print-dup* *print-readably* *fn-loader* *print-meta*
*in* *source-path* *compiler-options* *assert*}