質問

これは、リスプ愛好家(およびダイナミック言語の他の恋人)にとって冒aspのように聞こえるかもしれないことを知っていますが、Clojureコンパイラを強化して静的(コンパイル時間)タイプのチェックをサポートすることはどれほど難しいでしょうか?

静的および動的なタイピングに対する議論と反対の議論を別として、これは可能です(「これはお勧めできません」ではありません)?

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

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

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

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

役に立ちましたか?

解決

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

他のヒント

確かに可能です。しかし、Clojureがどんな形でも弱い静的タイピングを得るとは思わない - それは利点が少なすぎる。

しかし、リッチヒッキーは、QI言語の強力でオプションの表現力豊かなタイピング機能のように、何度か表現しています。 http://www.lambdassociates.org/qilisp.htm

alt text

はい!進行中のプロジェクトがあるようです、 core.typed, 、現実をチェックするオプションの静的タイプを作成します。を参照してください Githubプロジェクト そしてそのドキュメンテーション

この作品 学部の名誉論文(PDF)から成長しました Ambrose Bonnaire-Sergeantによって、そしてに関連しています タイプされたラケット システム。

一度に1つのフォームが読み取られて評価されるため、これをやや制限する前方参照を持つことはできません。

古い質問ですが、2つの重要なポイント:Clojureが読者のマクロをサポートしていないと思います。通常のLispマクロだけです。そして今、Crojureで入力するためのCore.Typedオプションがあります。

宣言はタイプのヒントを持つことができるので、varを「まだ定義されていないが構造に関するデータが含まれているタイプ」を宣言することができますが、これは本当に不格好で、コードパスの前にそれを行う必要がありますそれ たぶん......だろう タイプが定義される前に実行されます。基本的に、ユーザー定義のすべてのタイプを前もって定義し、通常のように使用することをお勧めします。それは図書館の書き込みをややハッキッシュにすると思います。

私は、これが不可能であることを以前に提案するつもりはありませんでした。ユーザー定義のタイプでは、事前に定義されたタイプよりもはるかに複雑です。これを行うことの利点は、コストは真剣に考慮すべきものです。しかし、私はそれを試してみて、彼らがそれを機能させることができるかどうかを見ることに興味がある人を奨励します!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top