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

欢迎!有关如何使用此网站的更多信息,请参阅关于页面。

0 投票
Java互操作性

附带的程序可以重现这个问题。我们有一个代理,p',它是java.io.InputStream的子类。java.io.InputStream有三个名为read的方法:抽象的int read(); int read(byte[] b); 和 int read(byte[] b, int off, int len); 请见http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html。在代理p'的定义中,我们实现了read的抽象变体,使得`p'成为java.io.InputStream的一个具体实例。

第一次调用的结果为-1,这是预期的。

第二次调用,(<. p (read b 0 n)),应调用java.io.InputStream中的int read(byte[] b, int off, int len);。但实际行为如下

$ clojure1.2 ~/tmp/proxy-bug.clj
主线程中出现异常:java.lang.IllegalArgumentException: 传递给:user$eval1$fn (proxy-bug.clj:0) 的参数数量不正确 (4)

    at clojure.lang.Compiler.eval(Compiler.java:5441)
    at clojure.lang.Compiler.load(Compiler.java:5858)
    at clojure.lang.Compiler.loadFile(Compiler.java:5821)
    at clojure.main$load_script.invoke(main.clj:221)
    at clojure.main$script_opt.invoke(main.clj:273)
    at clojure.main$main.doInvoke(main.clj:354)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.lang.Var.invoke(Var.java:365)
    at clojure.lang.AFn.applyToHelper(AFn.java:161)
    at clojure.lang.Var.applyTo(Var.java:482)
    at clojure.main.main(main.java:37)

原因:java.lang.IllegalArgumentException: 传递给:user$eval1$fn 的参数数量不正确 (4)

    at clojure.lang.AFn.throwArity(AFn.java:437)
    at clojure.lang.AFn.invoke(AFn.java:51)
    at user.proxy$java.io.InputStream$0.read(Unknown Source)
    at user$eval1.invoke(proxy-bug.clj:9)
    at clojure.lang.Compiler.eval(Compiler.java:5425)
    ... 10 more

$ clojure1.2 ~/tmp/proxy-bug.clj
主线程中出现异常:java.lang.IllegalArgumentException: 传递给:user$eval1$fn (proxy-bug.clj:0) 的参数数量不正确 (4)

    at clojure.lang.Compiler.eval(Compiler.java:5441)
    at clojure.lang.Compiler.load(Compiler.java:5858)
    at clojure.lang.Compiler.loadFile(Compiler.java:5821)
    at clojure.main$load_script.invoke(main.clj:221)
    at clojure.main$script_opt.invoke(main.clj:273)
    at clojure.main$main.doInvoke(main.clj:354)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.lang.Var.invoke(Var.java:365)
    at clojure.lang.AFn.applyToHelper(AFn.java:161)
    at clojure.lang.Var.applyTo(Var.java:482)
    at clojure.main.main(main.java:37)

原因:java.lang.IllegalArgumentException: 传递给:user$eval1$fn 的参数数量不正确 (4)

    at clojure.lang.AFn.throwArity(AFn.java:437)
    at clojure.lang.AFn.invoke(AFn.java:51)
    at user.proxy$java.io.InputStream$0.read(Unknown Source)
    at user$eval1.invoke(proxy-bug.clj:9)
    at clojure.lang.Compiler.eval(Compiler.java:5425)
    ... 10 more

3 回答

0 投票

评论由:[email protected] 提出

第二种行为应在Clojure 1.3中出现

$ clojure1.3 ~/tmp/proxy-bug.clj
主线程中出现异常:clojure.lang.ArityException: 传递给:user$eval1$fn 的参数数量不正确 (4)

    at clojure.lang.AFn.throwArity(AFn.java:437)
    at clojure.lang.AFn.invoke(AFn.java:51)
    at user.proxy$java.io.InputStream$0.read(Unknown Source)
    at user$eval1.invoke(proxy-bug.clj:9)
    at clojure.lang.Compiler.eval(Compiler.java:6468)
    at clojure.lang.Compiler.load(Compiler.java:6905)
    at clojure.lang.Compiler.loadFile(Compiler.java:6866)
    at clojure.main$load_script.invoke(main.clj:282)
    at clojure.main$script_opt.invoke(main.clj:342)
    at clojure.main$main.doInvoke(main.clj:426)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at clojure.lang.Var.invoke(Var.java:401)
    at clojure.lang.AFn.applyToHelper(AFn.java:161)
    at clojure.lang.Var.applyTo(Var.java:518)
    at clojure.main.main(main.java:37)

对此不便表示歉意。

0 投票

评论由:mullr 提出

已与Clojure 1.5.1验证

`
clojure.lang.ArityException: 传递给:user$eval147$fn 的参数数量不正确 (4)

                                  AFn.java:437 clojure.lang.AFn.throwArity
                                   AFn.java:51 clojure.lang.AFn.invoke
                              (Unknown Source) user.proxy/java.io.InputStream[fn]
                              NO_SOURCE_FILE:9 user/eval147
                            Compiler.java:6619 clojure.lang.Compiler.eval
                            Compiler.java:6582 clojure.lang.Compiler.eval
                                 core.clj:2852 clojure.core/eval
                                  main.clj:259 clojure.main/repl[fn]
                                  main.clj:259 clojure.main/repl[fn]
                                  main.clj:277 clojure.main/repl[fn]
                                  main.clj:277 clojure.main/repl
                              RestFn.java:1096 clojure.lang.RestFn.invoke
                     interruptible_eval.clj:56 clojure.tools.nrepl.middleware.interruptible-eval/evaluate[fn]
                                  AFn.java:159 clojure.lang.AFn.applyToHelper
                                  AFn.java:151 clojure.lang.AFn.applyTo
                                  core.clj:617 clojure.core/apply
                                 core.clj:1788 clojure.core/with-bindings*
                               RestFn.java:425 clojure.lang.RestFn.invoke
                     interruptible_eval.clj:41 clojure.tools.nrepl.middleware.interruptible-eval/evaluate
                    interruptible_eval.clj:171 clojure.tools.nrepl.middleware.interruptible-eval/interruptible-eval[fn]
                                 core.clj:2330 clojure.core/comp[fn]
                    interruptible_eval.clj:138 clojure.tools.nrepl.middleware.interruptible-eval/run-next[fn]
                                   AFn.java:24 clojure.lang.AFn.run
                  ThreadPoolExecutor.java:1110 java.util.concurrent.ThreadPoolExecutor.runWorker
                   ThreadPoolExecutor.java:603 java.util.concurrent.ThreadPoolExecutor$Worker.run
                               Thread.java:722 java.lang.Thread.run

`

0 投票
参考: https://clojure.atlassian.net/browse/CLJ-1001 (由 alex+import 报告)
...