当一个函数存储在 var 的元数据中时,它的行为似乎(至少对我来说)不合常理。
这是否是一个错误,还是预期的行为?如果是后者,原因是什么?
假设以下def
(def
^{:fn-in-meta (fn [a b] (+ a b))}
my-var
:value)
Clojure 中的操作如预期,可以从元数据中获取函数,它仍然是普通函数。
; clj
(-> #'my-var
meta
:fn-in-meta)
;; => #function[myns/fn--27244]
; clj
(-> #'my-var
meta
:fn-in-meta
type)
;; => myns$fn__27244
在 clojurescript 中,执行相同的操作似乎会产生一种类似宏展开的半编译状态。
; cljs
(-> #'my-var
meta
:fn-in-meta)
;; => (fn [a b] (+ a b))
; cljs
(-> #'my-var
meta
:fn-in-meta
type)
;; => cljs.core/List
最后,请注意,向其他对象(如向量)添加元数据在 Clojure 和 JavaScript 中都是正常行为。
; cljs
(->> {:fn-in-meta (fn [a b] (+ a b))}
(with-meta [])
meta
:fn-in-meta
type)
;; => #object[Function]
; clj
(->> {:fn-in-meta (fn [a b] (+ a b))}
(with-meta [])
meta
:fn-in-meta
type)
;; => myns$eval27282$fn__27283