Clojure 2024 年度调查中分享您的想法!

欢迎!请访问关于 页面,了解更多有关本站的详细信息。

0
ClojureScript

对于具有变长参数的 defn:如果调用时缺少固定参数,则它们将使用变长方法而不是错误;如果调用时使用的是最大固定参数,将调用变长方法而不是固定形式。

`
(defn f-hole
([a] 1)
([a b c d & args] "4或更多"))

(f-hole 1 2) ; =>"4或更多",应当是错误

(defn f-overlap-mfa
([a b] 2)
([a b & c] "2+"))

(f-overlap-mfa 1) ;=> "2+", 应当是错误
(f-overlap-mfa 1 2) ;=> "2+", 应当是2
(f-overlap-mfa 1 2 3) ;=> "2+", 正确
`

修复 f-hole 错误的方法是将带有无签名或参数数小于最大固定参数数的所有 X 生成 "case X:" 语句到 switch 语句中。

我对 f-overlap-mfa 的行为不确定为什么,也没有深入研究。

3 答案

0

评论者:

抱歉,提交的是 CLJ 而不是 CLJS!

0

评论者:

对于 f-overlap-mfa 的行为,我看到的是:

(f-overlap-mfa 1) ;=> "2+" (f-overlap-mfa 1 2) ;=> 2 (f-overlap-mfa 1 2 3) ;=> "2+"

所以与我相比,两个参数的结果不同,(链接: ~favila)。

不过,只有一个参数的调用会发出警告。

{{WARNING: 向 cljs.user/f-overlap-mfa 传递的参数数量错误(1)}}

0
参考:https://clojure.atlassian.net/browse/CLJS-1678(由 favila 报告)
...