clojure - 如何从变量获取函数的元数据

标签 clojure metadata

我有一个可以处理函数元数据的函数。我知道我可以通过以下语法获取函数的元数据:

(meta #'println)

它返回我感兴趣的元数据:

{:arglists ([& more]), :doc "Same as print followed by (newline)", :added "1.0", :static true, :line 3631, :column 1, :file "clojure/core.clj", :name println, :ns #namespace[clojure.core]}

但是如果它在变量内部,它就不起作用。我尝试了以下方法

(defn x [f] (meta #'f))

当然它会抛出以下错误:

clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to resolve var: f in this context, compiling:(/var/folders/zs/_8vy14592dncxyj8mcz4jfyc000_9z/T/boot.user1460390749042099586.clj:1:1)
             java.lang.RuntimeException: Unable to resolve var: f in this context

如果我只使用元,则不起作用:

(defn x [f] (meta f))
(x println)

因为它返回的是 nil,而不是 println 函数的原始元数据。

当我尝试使用反引号时也是如此:

(defn x [f] (meta `f))

最佳答案

在这种情况下,您要查找的信息包含在包含该函数的 var 中,而不是在该函数中。

如果您只获得容器中的内容,则在将物体从容器中取出之前,您无法读取盒子上写的内容。

  • 命名空间包含 var 并给它们命名
  • 变量附加了有关其所包含函数的元数据。
  • 变量也包含函数。

函数可以有元数据,尽管您要查找的特定元数据位于 var 的 hte 元数据中。

(meta #'symbol-here)

在当前命名空间中查找与符号 symbol-here 关联的 var,然后查看该对象并从中获取元数据。

如果您将 var 本身传递给函数 f 而不是传递它的内容,那么您可以从该函数内查找元数据:

user> (defn x [f]
        (f "calling f with a string")
        (meta f))
#'user/x
user> (x #'println)
calling f with a string
{:arglists ([& more]), :doc "Same as print followed by (newline)", :added "1.0", :static true, :line 3631, :column 1, :file "clojure/core.clj", :        name println, :ns #namespace[clojure.core]}

这里重要的部分是,您传递了实际包含您正在查找的元数据的对象(var),而不是容器中的对象(函数),还值得注意的是,如果您将 var 调用为一个函数,var 将使用相同的参数自动调用它包含的函数并将响应传回。

关于clojure - 如何从变量获取函数的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37794375/

相关文章:

ffmpeg - 使用 ffmpeg 传输自定义(所有)元数据

linux - 如何使用 bash 在连续运行时创建具有相同元数据/时间戳的目录结构?

java - 如何将 GEVA 集成到 Clojure 中

error-handling - 具有故障形式的 clojure 线程宏

clojure - Clojure 中的高阶函数

android - 从当前播放的音频访问元数据。 (内置或外部应用程序)

rest - 如何使用 REST API 重建 Nexus 存储库元数据?

Clojure:使用 assoc-in 的结果不一致

clojure - 如何读取clojure堆栈跟踪?

ffmpeg 元数据副本(全部)