3

これは、 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))

ありがとう。

4

3 に答える 3

3

def問題は、コンパイラが'd変数のタイプを追跡しないことです。そうです、あなたの簡単な例では、それは可能です。しかし、どのくらいの頻度でリテラルを渡しますか?まれに、実際のプログラムでは。

実際の静的に型付けされた言語のように型を「フロースルー」させるには、大量の手直しが必要になります。vars、動的にリバウンドされたvars、逆参照などを介して型情報を追跡する必要があります。それでも、コレクション/シーケンスからアイテムを引き出すという問題があります。これは、ワームの巨大な缶である一般化された型を意味します...

Clojureの型アノテーションは、コンパイル時に型の安全性を提供することを意図したものではありませんでした。コンパイラーがより最適化されたコードを生成できるようにするだけです(予期しない型が発生した場合はランタイムエラーが発生します)。

完全な静的型付け情報をコンパイラーに組み込むことは可能かもしれませんが、その時点で言語を大幅に書き直し、型の処理方法について多くの決定とトレードオフを行う必要があります。もうClojureではありません。

于 2010-11-17T14:43:02.330 に答える
2

コンパイラーを変更しようとするのではなく、Clojureコードファイルをスキャンして型違反について警告する別のツールを作成してみませんか?通常の型指定されていないClojureコードに折りたたまれるマクロを使用して、独自の型表記を開発できます。ただし、静的タイプチェッカーを実行すると、タイプが削除され、警告が出力されます。

少し大きな課題に挑戦した場合は、型推論を実行して、表記の負担を軽減することもできます。

于 2011-09-22T12:53:04.030 に答える
1

そのスレッドに続いて、漸進的型付けをclojure(Dartなど)に導入することを目的としたプロジェクトがあります。テストする価値がある: Typed-Clojure

誰かが実際の使用後にフィードバックを与えることができれば...

于 2012-12-05T09:51:32.527 に答える