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

欢迎!请查看关于页面以获取更多关于这是如何工作的信息。

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'的定义中,我们实现了(method) read的抽象版本,使`p'`成为java.io.InputStream的一个具体实例。

第一次调用,(. p read),返回-1,这是预期结果。

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

$ clojure1.2 ~/tmp/proxy-bug.clj
线程 "main" 中发生异常异常:在 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)

原因:在 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
线程 "main" 中发生异常异常:在 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)

原因:在 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
线程 "main" 中发生异常 clojure.lang.ArityException:在 user$eval1$fn (proxy-bug.clj:0) 中传递了错误的参数数量 (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 (proxy-bug.clj:0) 中传递了错误的参数数量 (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
by
参考: https://clojure.atlassian.net/browse/CLJ-1001 (由 alex+import 报告)
...