请访问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

请注意,函数并不是明确表示支持元数据的,因此您处于一个相对不确定的领域。作为参考

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

Vars也(显然)支持元数据,您可以在上面的示例中将它放在那里,这是完全可以的。

我想表达的意思是,如果相关的库依赖于在函数上放置元数据,这对我说来似乎是可疑的(除非它是库制作的IFn实现)。

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

作为一个权宜之计,这似乎是有效的

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