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

最后,请注意,在多种语言中,将元数据添加到其他对象(如向量)会表现正常。

 ; 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宏的元数据位置,因此其评估是按照常规方式进行的。

...