如何从变量中获取函数的元数据
How to get the metadata of a function from a variable
我有一个函数可以处理函数的元数据。我知道我可以通过以下语法获取函数的元数据:
(meta #'println)
它 returns 包含我感兴趣的元数据:
{: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)
因为它returns带有nil
而不是println
函数的原始元数据。
当我尝试使用反引号时也是如此:
(defn x [f] (meta `f))
在这种情况下,您要查找的信息包含在包含函数的 var 中,而不是在函数中。
如果只给你一个容器的内容,你将无法阅读在从容器中取出对象之前盒子上写的内容。
- 命名空间包含
var
并给它们命名
- 变量有关于它们所包含的函数的元数据。
- 变量也包含函数。
函数可以有元数据,尽管您要查找的特定元数据在 var 的 hte 元数据中。
(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 将使用相同的参数自动调用它包含的函数并将响应传回。
我有一个函数可以处理函数的元数据。我知道我可以通过以下语法获取函数的元数据:
(meta #'println)
它 returns 包含我感兴趣的元数据:
{: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)
因为它returns带有nil
而不是println
函数的原始元数据。
当我尝试使用反引号时也是如此:
(defn x [f] (meta `f))
在这种情况下,您要查找的信息包含在包含函数的 var 中,而不是在函数中。
如果只给你一个容器的内容,你将无法阅读在从容器中取出对象之前盒子上写的内容。
- 命名空间包含
var
并给它们命名 - 变量有关于它们所包含的函数的元数据。
- 变量也包含函数。
函数可以有元数据,尽管您要查找的特定元数据在 var 的 hte 元数据中。
(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 将使用相同的参数自动调用它包含的函数并将响应传回。