当将函数存储到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
最后,请注意,在多种语言中,将元数据添加到其他对象(如向量)会表现正常。
; 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