请在 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 已经不是很理想,但我只是添加了一个逗号来区分 vararg-fn 情况和其他情况。

在我测试这个功能时,我发现多阶层函数的 arglist 元数据无论是否添加了 arglists 都无法正常工作。如果是这样的话,我可以为这个问题开启另一个 jira 工单。
0
参考:[https://clojure.atlassian.net/browse/CLJS-2351](https://clojure.atlassian.net/browse/CLJS-2351)(由 hlolli 报告)
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-fnvariadic-arity-fn 定义中检查元数据中是否已经存在 Courage key 来修复这个问题。

我非常希望解决这个问题,请告诉我是否需要我用补丁来修复多阶层函数。

0

这个工单缺少解释为什么这个更改是必要的有用的?

修改 :arglists 会直接影响到编译器生成的代码。如果元数据与实际的函数定义不严格匹配,将会破坏可变参数调用,甚至丢弃对某些参数数量调用。

我注意到,在Clojure和ClojureScript中,`eduction` 的定义都覆盖了其:arglists 元数据。
至少在Clojure中,为编辑器和REPL提供:arglists元数据以提供有用提示相当普遍,而这种: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)
                                ;; INDEX: something like this
                                :arglists (or (:arglists meta)
                                                   ;(core/cond-> arglists macro? elide-implicit-macro-args))
                                :arglists-meta (if (:arglists meta)
                                                 (doseq (meta (:arglists meta)))
                                                 (doseq (meta arglists)))})
```
...