2013-03-05 17 views
6

で地元のヒント入力できない誰かが私にこのエラーを説明してもらえ:は原始初期化子

user> (let [^int i 3] i) 
CompilerException java.lang.UnsupportedOperationException: Can't type hint a local with a primitive initializer, compiling:(NO_SOURCE_PATH:1) 

私は理解していない、

  • 私は、なぜ、ヒントを入力することはできませんまさに?私は同じような状況に配列型のヒントを使用することができますなぜ

  • user> (let [^ints ii (int-array 1)] ii) 
    #<int[] [[email protected]> 
    
  • ローカル整数変数をタイプヒントする方法はありますか。

+0

参照http://clojure.org/java_interop#Java%20Interop-Some%20optimization%20tips:。「([FOO(int型バー)]みましょう...)プリミティブローカルを取得するための正しい方法ですしないでください^整数などを使用してください。 –

+0

おそらく、コンパイラは既にここで 'i'の型を判断するのに十分な知識を持っているからです。 – Alex

+0

@ A.Webbありがとうございます。おそらく私の実用的な問題を解決するでしょう。質問をしばらく開いたままにしておきます。うまくいけば、誰かがこの制限の理由を説明することができます。 – sastanin

答えて

4

この例外は、コンパイラによってthis行からスローされます。あなたは原始的な定数など原始的な定数であるようにコンパイル時に評価することができるものである表現を使用する場合、基本的に:(+ 1 10)を、コンパイラはオブジェクト自体のタイプを検出することができますし、タイプヒンティングを必要としません。以前のリンクが指している同じクラスのメソッドgetJavaClasshasJavaClassを確認します。これらのメソッドは、式がプリミティブであるかどうかをチェックし、式自体からクラスを取得します。そうでない場合は、提供されている場合はタイプヒントを使用します。

+0

は、これは聞いて本当に面白いですが、(ちょうど数週間前に出てきた第二版)のClojureの喜びでCH 15.1から3の全体のセクションでは、これに反する例でいっぱいです。もちろん、それらの例も私のreplの中でうんざりしていますが、なぜ彼らが最適化のためにこれを行うことを推奨しているのか不思議です。型チェッカーをオフにすることで、最適化するためにいくつかの方法はありますか、これは厄介な編集の仕事であり、彼らは実際にそのようなタイプヒンティングが許されたのClojureの古いバージョンを使用していますか? – kurofune

関連する問題