23

Lisp 愛好家 (およびその他の動的言語愛好家) にとって、これは冒涜のように聞こえるかもしれませんが、静的 (コンパイル時) 型チェックをサポートするように Clojure コンパイラを拡張するのはどれほど難しいでしょうか?

静的型付けと動的型付けの賛成論と反対論を脇に置いて、これは可能ですか (「これはお勧めできません」)?

コンパイル時の型を強制する新しいリーダー マクロ (#^ マクロの拡張バージョン) を追加し、型情報をシンボル テーブルに追加すると、変数が誤用された場所にコンパイラがフラグを立てることができるようになると考えていました。たとえば、次のコードでは、コンパイル時エラーが予想されます (#* は「コンパイル時」タイプのマクロです)。

(defn get-length [#*String s] (.length s))
(defn test-get-length [] (get-length 2.0))

#^ マクロをグローバル変数 ( *compile-time-type-checking*) で再利用して、コンパイラにチェックを強制することもできます。

実現可能性について何か考えはありますか?

4

6 に答える 6

10

それは確かに可能です。ただし、Clojure が弱い静的型付けを行うことはないと思います。その利点は少なすぎます。

ただし、Rich Hickey は何度か、Qi 言語の強力でオプションの表現力豊かなタイピング機能に対する好みを表明しています。 http://www.lambdassociates.org/qilisp.htm

代替テキスト

于 2010-11-15T14:07:21.923 に答える
7

はい!core.typedオプションの静的型チェックを実現するプロジェクトが進行中のようです。Github プロジェクトとその ドキュメントを参照してください

この作品は、Ambrose Bonnaire-Sergeant による学部の優等論文 (PDF)から派生したもので、 Typed Racketシステムに関連しています。

于 2013-03-19T18:51:19.180 に答える
7

それは確かに可能です。コンパイラは、1.3 開発ブランチのプリミティブ引数の型に関して、いくつかの静的な型チェックを既に行っています。

于 2010-11-15T13:47:43.200 に答える
0

一度に 1 つのフォームが読み取られて評価されるため、前方参照を行うことができず、これが多少制限されます。

于 2010-11-15T13:30:53.360 に答える
0

宣言には型のヒントを含めることができるため、まだ定義されていないが構造に関するデータを含む型「である」var を宣言することは可能ですが、これは非常に扱いにくく、コード パスの前に宣言する必要があります。タイプが定義される前に実行される可能性があります。基本的に、すべてのユーザー定義型を事前に定義してから、通常どおりに使用する必要があります。それがライブラリの書き込みをややハックにしていると思います。

これが不可能であることを前に示唆するつもりはありませんでした。ユーザー定義型の場合、定義済みの型よりもはるかに複雑です。これを実行するメリットとコストは、真剣に検討する必要があります。でも、興味のある人は試してみて、うまくいくかどうか試してみることをお勧めします!

于 2010-11-15T15:30:43.063 に答える