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 投票
by

评论者:dnolen

补丁审查,我并不真正理解更改 variadic-fn 的可变参数数和添加新标志的目的。直接将逻辑放入 variadic-fn 不是更简单吗?

0 投票
by
评论者:hlolli

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

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

合并 arglists 后,无法确定 :arglists 是否来自提供的元数据。但我会重命名 let 符号,避免添加可变参数,我今天稍后做一个新的补丁。

我还没有提交 Clojure 贡献者协议,我现在正在填写...
0 投票
by
评论者:hlolli

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

代码
用于元数据的符号名 m(m 表示 metadata)本身就不是很好,但我只是在 vararg-fn 的情况和其他情况之间添加了一个逗号来区分。

我在测试这个过程中发现,多参数函数的 arglist 元数据不与或不与特定的 arglists 一起使用。如果是这样,我可以为此打开另一个 jira 项目。
0 投票
by
引用:[https://clojure.atlassian.net/browse/CLJS-2351](https://clojure.atlassian.net/browse/CLJS-2351)(由 hlolli 报告)
0 投票
"../../index.php/user/win-some" класс="qa-avatar-link"> by

这也适用于多参数函数

(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-fnvariadic-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)))})
```
...