如何从变量中获取函数的元数据
问题描述:
我有一个函数可以处理函数的元数据。我知道,我可以得到一个功能的元数据的语法如下:如何从变量中获取函数的元数据
(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
S和给他们的名字 - 经销商也有元数据atached他们谈它们所包含的功能。
- 变量也具有功能。
函数可以包含元数据,但您正在查找的特定元数据位于var的元数据中。
(meta #'symbol-here)
会在当前命名空间与符号symbol-here
相关的变种,然后看着那个对象,并从中获取元数据。
如果您通过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将自动使用相同的参数调用它所包含的函数并传回回应。
那么,有没有一种方法来获取我引用的'println'的原始元数据? –
它取决于你的函数如何被调用。我会将其广告给答案 –
它被称为像我在问题中写的:'(x println)' –