ClojureCLR强制错误

时间:2013-04-06 03:29:48

标签: clojure clojureclr

我在ClojureCLR REPL中获得了基本强制的编译器异常:

=> (class 12)
System.Int64

=> (class 12.34)
System.Double

=> (class (new System.Double 12))
CompilerException System.InvalidOperationException: No constructor in type: Double with 1 arguments
at clojure.lang.CljCompiler.Ast.NewExpr.ComputeCtor() in D:\work\clojure-clr-1.4.1-fix\Clojure\Clojure\CljCompiler\Ast\NewExpr.cs:line 73
at clojure.lang.CljCompiler.Ast.NewExpr..ctor(Type type, List`1 args, IPersistentMap spanMap) in D:\work\clojure-clr-1.4.1-fix\Clojure\Clojure\CljCompiler\Ast\NewExpr.cs:line 49
at clojure.lang.CljCompiler.Ast.NewExpr.Parser.Parse(ParserContext pcon, Object frm) in D:\work\clojure-clr-1.4.1-fix\Clojure\Clojure\CljCompiler\Ast\NewExpr.cs:line 117
at clojure.lang.Compiler.AnalyzeSeq(ParserContext pcon, ISeq form, String name) in D:\work\clojure-clr-1.4.1-fix\Clojure\Clojure\CljCompiler\Compiler.cs:line 1560, compiling: (NO_SOURCE_PATH:60)

很抱歉,如果这是一个新问题,但行为与Java互操作不一样!

.NET的语法是否不同?

1 个答案:

答案 0 :(得分:1)

ClojureCLR中的Interop与Clojure中的interop非常相似,但平台差异确实显示出来。

java.lang.Double是一个与System.Double截然不同的生物。 JVM的Double是一个包装类,它与原始double值类不同。 CLR的Double实际上是原始双值的类。 j.l.Double有很多方法在S.Double中没有平行。举个例子:j.l.Double有几个构造函数; S.Double没有。要完成你想要的,请使用clojure.core / double:

user=> (class (double 2))
System.Double

Java包装器类型可能会遇到平台差异:CLR没有明确的包装器类型。我不知道有任何地方试图详细介绍这一点。

有关如何处理不在JVM中的事物的CLR互操作的提示,例如by-ref参数,枚举等,请查看the wiki on the github repo for ClojureCLR