Clojure 2024状况调查中分享您的想法!

欢迎!请查看关于页面以了解更多有关该功能的详细信息。

+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

请注意,函数并不是声明支持元数据的,所以您处于一个某种程度上未定义的区域。仅供参考

确实,有的函数实现支持某些目的的元数据,但我不认为这是您在所有地方都应该期待的功能。

Vars 也可以(显然)支持元数据,您可以在上面示例中放置它,这将完全没问题。

我认为我的观点是,如果特定的库依赖于在函数上添加元数据,这似乎有些可疑(除非这是一个由库创建的IFn实现)。

谢谢,知道这个很好。那么,clojurescript有一个`MetaFn`和显式的`meta`函数检查很有趣。

作为一个权宜之计,这似乎是可行的

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