質問
このフォローアップのClojureの静的型付けの私の前の質問にすることです。
私は、コンパイラのJavaソースコードを閲覧し、それが*warn-on-reflection*
の値をチェックし、いくつかの場所があるが、私は以下のコードをコンパイルするとき、私は唯一の実行時エラーを取得します:
(defn div-2 [^String s] (/ 2 s))
このコードは、 のないコンパイル時の警告を与える必要があり、どのような状況では(そうでない)はありますか?いかに難しいか、それは、コンパイラは次のコードに警告を与える持っているだろう。
(defn get-length [^String s] (.length s))
(defn test-get-length [] (get-length 2.0))
感謝します。
解決
問題は、コンパイラがdef
'd VARSの種類を追跡していないということです。そうです、あなたの簡単な例では、それが可能です。しかし、どのくらいの頻度は、リテラルを渡すのですか?まれに、実際のプログラムインチ
彼らは本当の静的型付け言語でやるようなタイプは、リワークの大規模な量を必要とする「を流れ」を作ります。あなたがを、VARSて型情報を追跡する動的VARSリバウンド、逆参照、などそして、あなたする必要があると思い、まだのあるgenericized種類を暗示コレクション/シーケンスの外にアイテムを引っ張っの問題を、持っていますの巨大なのワームの缶...
のClojureでの型注釈がコンパイル時に型の安全性を提供するために意図されていませんでした - (。予期しないタイプが検出された場合は、実行時エラーを犠牲にして)彼らは、コンパイラがより最適化されたコードを生成することができます。
フル静的タイピング情報とコンパイラのインスツルメントすることは可能かもしれませんが、その時点で、あなたは、主に言語を書き換えてきた、とあなたはタイプがどのように処理されるかに多くの決定とトレードオフをしなければならなかったでしょう。それは本当にもうClojureのではないでしょう。
他のヒント
コンパイラを変更しようとするのではなく、なぜちょうどClojureのコードファイルをスキャンし、タイプの違反について警告し、別のツールを作成していませんか?あなたは、通常の型なしClojureのコードにちょうど崩壊というマクロを使用して、独自の種類の表記法を開発することができます。あなたは、静的な型チェックを実行する場合でも、それはタイプと出力警告を完全に理解します。
あなたは大きめの挑戦のためにアップした場合、あなたも、それはこのように表記の負担を下げ型推論を行う可能性があります。
は、そのスレッドのフォローアップ、今のClojureに緩やかなタイピングをもたらすことを目指したプロジェクトがある(ダート、などなど)。それをテストワース: 型付き-Clojureのの
誰かが、実使用後にいくつかのフィードバックを与えることができれば...