gpt4 book ai didi

function - 如何动态查找 Clojure 函数的元数据?

转载 作者:行者123 更新时间:2023-12-03 02:20:01 24 4
gpt4 key购买 nike

假设我有以下代码:

(defn ^{:graph-title "Function 1"} func-1  [x]  (do-something-with x))(defn get-graph-title   [func]  (str    ((meta func) :graph-title))) 

我希望它返回“Function 1”,但它返回 nil。我认为这源于以下差异,我并不完全理解:

(meta func-1)=>  {:ns some-ns-info, :name func-1}(meta #'func-1)=>  {:ns some-ns-info, :name func-1, :graph-title "Function 1"}

有人可以向我解释一下吗?

最佳答案

有关于函数 func-1的元数据,关于Var #'func-1的元数据,以及符号'func-1上的元数据。 Clojure 读取器宏 ^ 在读取时将元数据添加到符号defn 宏在编译时将元数据从 symbol 复制到 Var

在 Clojure 1.2 之前,函数不支持元数据。在 Clojure 1.2 中,它们这样做了,并且 defn 还将一些标准 Var 元数据复制到 函数:

Clojure 1.2.0
user=> (defn ^{:foo :bar} func-1 [] nil)
#'user/func-1
user=> (meta func-1)
{:ns #<Namespace user>, :name func-1}
user=> (meta #'func-1)
{:foo :bar, :ns #<Namespace user>, :name func-1, ...

但是,在当前的 Clojure 1.3 快照中,defn 不会将任何元数据复制到该函数:

Clojure 1.3.0-master-SNAPSHOT
user=> (defn ^{:foo :bar} func-1 [] nil)
#'user/func-1
user=> (meta func-1)
nil
user=> (meta #'func-1)
{:foo :bar, :ns #<Namespace user>, :name func-1, ...

一般来说,如果您想获取定义的元数据,您需要 Var 上的元数据。

关于function - 如何动态查找 Clojure 函数的元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5592306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com