请在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

补丁审查,我并不真正理解更改可变参数函数的arity以及添加新标志的目的。直接将逻辑放入可变参数函数中不好吗?

0投票
_由 hlolli 发表的评论_

是的,我会为我的补丁找到更好的解决方案,只是第3176行let绑定中的`m`符号而已

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

合并了arglists,并且在此之后无法知道:arglists是否来自提供的元数据。但我会重命名let符号,避免添加arity很容易,我今天晚些时候会再次提交补丁。

我还没有提交我的Clojure贡献者协议,我现在正在填写...
0投票
_由 hlolli 发表的评论_

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

代码
用于元数据的符号名m(m为metadata)已经不是很合适,但我只是在vararg-fn情况和其它情况之间添加了逗号来区分。

我发现我在测试这个时,多arity-fn arglist元数据在没有或没有特别添加arglists的情况下都不工作。如果是这样,我可以为それ開辟另一個jira問題。
0投票
参考: https://clojure.atlassian.net/browse/CLJS-2351(由hlolli报告)
0投票

这也适用于多arity函数

(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}

而单arity函数可以正常工作

(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键来解决这个问题。

我很希望看到这一点得到修复,如果需要,我可以为multi-arity-fn修复提供补丁。

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 (或 (:arglists meta)
                                                      (core/cond-> arglists macro? elide-implicit-macro-args))
                                :arglists-meta (如果 (:arglists meta)
                                                 (全部处理 (map meta (:arglists meta)))
                                                 (全部处理 (map meta arglists))))})
```
...