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

欢迎!请参阅关于页面了解更多有关本网站如何运作的信息。

0
ClojureScript

对于具有可变数量参数的函数定义:如果用缺少的固定参数数量调用,则它们使用可变方法而不是报错;如果用最大固定参数数量调用,则调用可变方法而不是固定形式。

`
(defn f-hole
([a] 1)
([a b c d & args] "4 or more"))

(f-hole 1 2) ; =>"4 or more", 应该报错

(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 的 switch 语句中发出 "case X:"。

我不确定为什么 f-overlap-mfa 会发生这种情况,也没有深入研究。

3 个答案

0

由:favila 发布的评论

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

0

由:rohitaggarwal 发布的评论

我看到的对于 {{f-overlap-mfa}} 的行为是

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

因此,对于您和我来说,两个参数的结果是不同的(链接: ~favila)。

但是,只有一个参数的调用会给出警告

{{WARNING: Wrong number of args (1) passed to cljs.user/f-overlap-mfa}}

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