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

欢迎!请参阅关于页面以了解更多关于如何进行的工作信息。

+1投票
ClojureScript

MetaFn实例似乎存在高阶调用问题。

(def foo ^:foo (fn [& args]) )

(foo 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
;; => nil

(foo 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
;;=> Execution error (Error) at (<cljs repl>:1). 1 is not ISeqable

(foo 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
;;=> Execution error (Error) at (<cljs repl>:1). Invalid arity: 22

这体现在Ornament中,当人们在Hiccup组件中有许多子组件时https://github.com/lambdaisland/ornament/issues/4

1 答案

0投票

请注意,函数不是明确表示支持元数据的,因此您处在一定程度上不确定的领域。仅供参考:

确实,一些函数实现支持某些目的的元数据,但我不认为这是您在所有地方都可以期待的工作。

变量也(显然)支持元数据,您可以像上面例子中那样将其放在那里,这样是没问题的。

我觉得我的观点是,如果相关的库依赖于在函数上放置元数据,这似乎值得怀疑(除非它是由库制作的IFn实现)。

by
谢谢,这是值得知道的好信息。那么,ClojureScript拥有`MetaFn`和一个对`meta`中的函数显式检查,这很有趣。

作为解决方案,这似乎可行

```
 (def xxx (specify! (fn [& args] (count args)) cljs.core/IMeta (-meta [_] {:foo "bar"})))
```
...