Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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_Metadata - Fatal编程技术网

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

Clojure 如何从变量中获取函数的元数据,clojure,metadata,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[cl

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

(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
如果我只是使用meta,则不起作用:

(defn x [f] (meta f))
(x println)
因为它返回的是
nil
,而不是
println
函数的原始元数据

当我尝试使用backtick时也是如此:

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

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

如果只提供容器的内容,则无法读取在对象从盒子中移除之前写在盒子上的内容

  • 名称空间包含
    var
    s并给它们命名
  • 变量已向其提供有关其包含的函数的元数据
  • 变量也包含函数
函数可以有元数据,尽管您要查找的特定元数据位于var上的hte metadata中

(meta #'symbol-here)
在当前命名空间中查找与符号
symbol here
关联的变量,然后查看该对象并从中获取元数据

如果将变量本身传递给函数
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)
,然后答案是很遗憾的,不。它不能以合理的方式完成。你必须在每个名称空间中搜索包含你传递的同一对象的变量,并尝试猜测包含它的变量。这太糟糕了,因为我的函数也可以接收匿名函数,而这些函数不能作为变量传递。