1

基本的な強制のために 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 の構文は異なりますか?

4

1 に答える 1

1

ClojureCLR の相互運用は Clojure の相互運用と非常によく似ていますが、プラットフォームの違いが明らかになります。

java.lang.Double は、System.Double とはまったく異なる生き物です。JVM の Double は、プリミティブな double 値のクラスとは異なるラッパー クラスです。CLR の Double は、実際にはプリミティブ double 値のクラスです。jlDouble には、S.Double で並列化されていない多くのメソッドがあります。あなたの例について: jlDouble にはいくつかのコンストラクターがあります。S.Double にはありません。目的を達成するには、clojure.core/double を使用します。

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

Java ラッパー型は、プラットフォームの違いに遭遇する可能性が高い場所です。CLR には明示的なラッパー型がありません。これを詳細にカバーしようとした場所を私は知りません。

by-ref パラメーター、列挙型など、JVM にないものに対する CLR 相互運用を処理する方法に関するヒントについては、ClojureCLR の github リポジトリの wiki を確認してください。

于 2013-04-06T04:13:42.033 に答える