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

问题描述:

我有一个函数可以处理函数的元数据。我知道,我可以得到一个功能的元数据的语法如下:如何从变量中获取函数的元数据

(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将自动使用相同的参数调用它所包含的函数并传回回应。

+0

那么,有没有一种方法来获取我引用的'println'的原始元数据? –

+0

它取决于你的函数如何被调用。我会将其广告给答案 –

+0

它被称为像我在问题中写的:'(x println)' –