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

欢迎!有关如何操作的更多信息,请参阅关于页面。

+1
ClojureScript
考虑不带参数的函数


(defn aarg {:arglists '([fake])} [])
=> {:ns cljs.user,
 :name aarg,
 :file nil,
 :end-column 11,
 :column 1,
 :line 1,
 :end-line 1,
 :arglists ([fake]),
 :doc nil,
 :test nil}


一切按预期进行,但是当引入可变参数后


(defn aarg {:arglists '([fake])} [& env])
(meta #'aarg)
=> {:ns cljs.user,
 :name aarg,
 :file nil,
 :end-column 11,
 :top-fn {:variadic true,
          :max-fixed-arity 0,
          :method-params [(env)],
          :arglists ([& env]),
          :arglists-meta (nil)},
 :column 1,
 :line 1,
 :end-line 1,
 :arglists ([& env]),
 :doc nil,
 :test nil}


:arglists 不会受到影响。

8 条回答

0

评论者:hlolli

我刚刚提交了一个补丁,以前从未使用过 jira 补丁系统,除此之外,这个补丁将使编译器在用户提供时尊重 :arglists 元数据。希望得到反馈并合并:)

0

评论者:dnolen

感谢,你提交了 Clojure CA 吗?

0

评论者:dnolen

补丁审查,我并不十分理解改变变长函数的完整性和添加新标志的目的。为什么不直接将逻辑放入变长函数中呢?

0
_由 hlolli 发布的评论:

是的,我会寻找更好的解决方案来解决我的补丁,只是3176行let绑定中的`m`符号。

m (conj {:arglists (core/list 'quote (sigs fdecl))} m)

合并arglists之后,就再也没有办法知道:arglists是否来自于提供的元数据。但我会重命名let符号,这样很容易避免添加完整性,我会在今天稍后发布另一个补丁。

我还没有提交我的Clojure贡献者协议,我现在正在进行填写...
0
_由 hlolli 发布的评论:

昨天我签署了Clojure CA
"Rich Hickey和Hlöðver Sigurðsson之间的Clojure CA已签署和存档!"

代码
符号名m(对于元数据)已经不是一个很好的选择,但我只是添加了一个逗号来区分变长函数和其他情况。

我在测试这个过程中发现,多完整性函数的arglist元数据不能与或没有显式添加arglists一起使用。如果是这样,我可以为这个问题打开另一个jira工单。
0
0

这对于多完整性函数也是如此

(defn bar {:arglists '([foo bar])}
  ([x] 1)
  ([x y] 2))

(meta #'bar)
;;=> {:ns cljs.user,
 :name bar,
 :file nil,
 :end-column 10,
 :top-fn
 {:variadic? false,
  :fixed-arity 2,
  :max-fixed-arity 2,
  :method-params ([x] [x y]),
  :arglists ([x] [x y]),
  :arglists-meta (nil nil)},
 :column 1,
 :line 1, 
 :end-line 1, 
 :arglists ([x] [x y]), 
 :doc nil, 
 :test nil}

而单完整性函数工作正常

(defn foo {:arglists '([foo])} [x] 1)
(meta #'foo)
;; => {:ns cljs.user,
 :name foo,
 :file nil,
 :end-column 10,
 :column 1,
 :line 1, 
 :end-line 1, 
 :arglists ([foo]), 
 :doc nil, 
 :test nil}

我认为这可以通过检查在multi-arity-fn定义和variadic-arity-fn中对元数据中是否存在:arglists键来修复。

我希望看到这个问题得到解决,如果需要,我也可以提供一个修复多完整性故障的补丁。

0

该工单遗漏了对为什么需要/有用此更改的解释?

修改 :arglists 会直接影响编译器生成的代码。如果元数据与实际函数定义不完全匹配,则可能会破坏可变参数调用,甚至在某些函数类别中“丢弃”调用。

我在Clojure和ClojureScript中注意到了`eduction`的定义覆盖了其`:arglists`元数据。
在Clojure中,至少,提供`:arglists`元数据以提供编辑器和REPL的有用提示是一种相当常见的情况,并且`:arglists`元数据不会影响语义:它只是提供人类可读提示。

以下在Clojure中有效

dev=> (defn foo {:arglists '([foo bar])} ([x]) ([x y]))

#'dev/foo

dev=> (meta #'foo)

{:arglists ([foo bar]), :line 1, :column 1, :file "/home/seanc/.clojure/dev.clj", :name foo, :ns #object[clojure.lang.Namespace 0x34e700f4 "dev"]}
正如我所说的,有几个地方`:arglists`元数据可能会影响生成的代码(例如[CLJS-1871](https://clojure.atlassian.net/browse/CLJS-1871)。

这应该用于文档目的没有问题,但从工单描述中并不清楚。
在我的情况下,这纯粹是为了文档目的,虽然我对CLJS代码库不太熟悉,但提议的补丁让我有些担忧。与其覆盖内部的`arglists`变量,我宁愿在组装元数据时覆盖它,在那里它不会产生下游影响。
在我的情况下,这纯粹是为了文档目的。而且这很重要,否则编辑器提示会显示gensyms而不是正确的名称。

我不熟悉CLJS代码库,但提议的补丁让我有些担忧。与其覆盖内部的`arglists`变量,我怀疑只在组装元数据时覆盖它是否会有帮助,在那里它不会有下游影响。

```
meta     (assoc meta
                               :top-fn
                               {:variadic? variadic?
                                :fixed-arity mfa
                                :max-fixed-arity mfa
                                :method-params (core/cond-> sigs macro? elide-implicit-macro-args)
                                ;; 修复:类似于这样
                                :arglists (or (:arglists meta)
                                                       (core/cond-> arglists macro? elide-implicit-macro-args))
                                :arglists-meta (if (:arglists meta)
                                                 (doall (map meta (:arglists meta)))
                                                 (doall (map meta arglists)))})
```
...