请在2024 年 Clojure 状态调查中分享您的想法!

欢迎!有关如何使用本站的信息,请参阅关于页面。

0
ClojureScript
编辑

当一个函数存储在 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

1 个回答

+1

被选中
 
最佳回答

这与宏展开无关。在 CLJS 中,vars 的元数据不会进行评估,仅此而已。为什么是这样——我不知道。有关此点的讨论,请参考https://clojure.atlassian.net/browse/CLJS-2390

您关于向量的示例可以正常工作,因为函数形式不在def宏的元数据位置中提到,所以它的评估是按常规方式进行的。

...