18

Clojure にはどのような種類の安全な言語構成要素があるのでしょうか?

Luke VanderHart と Stuart Sierra による「Practical Clojure」を数回読んだことがありますが、Clojure は (他の Lisp と同様に) コンパイル時の検証チェックを真剣に受け止めていないという明確な印象を今でも持っています。型安全性は、正しいセマンティクスのコンパイル時のチェックを行うための (非常に一般的な) 戦略の 1 つにすぎません

私がこの質問をしているのは、私が間違っていることを証明したくてたまらないからです。文字列を期待する関数が整数のリストなどで呼び出されないことを (実行時ではなくコンパイル時に) 検証するために、clojure で利用できる設計パターンにはどのようなものがありますか?

また、Paul Graham のような非常に賢明な人々が Lisp を公然と提唱し、その上に低レベル言語からすべてを実装できるようにすることを読んだことがあります (ほとんどの人は、言語自体がその上に再実装されていると言うでしょう)。本当なら、型チェックのようなものは簡単にできるはずです。clojure や他の Lisp に型システム (またはそのような型システムを実装する機能) が存在すると思いますか?それによって、プログラマーは検証チェックを実行時からコンパイル時、さらには設計時までオフセットすることができます。時間?

4

3 に答える 3

21

Clojure のコンパイル単位は非常に小さく、単一の関数です。Lisper は、開発中に実行中のプログラムの小さな部分を変更する傾向があります。このスタイルの開発に静的型チェックを導入することには問題があります。Gilad Bracha による「Types are Anti-Modular」という投稿をお勧めする理由について、より深い議論が必要です。したがって、Clojure は、Lisp の非常に REPL 指向の開発とうまく調和する前/後条件を好みます。

とはいえ、Clojure 用にアラカルト型のシステムを構築することは確かに望ましく、可能です。このトレイルは、Qi/Shen と Typed Racket によって開拓されました。この機能は、ライブラリとして簡単に提供できます。将来、core.logic - https://github.com/clojure/core.logicでそのようなものを構築したいと考えています。

于 2011-06-13T01:39:30.077 に答える
4

Clojure は動的言語であるため、コンパイル時に型 (またはその他のほとんど) をチェックしないことが全体の考え方です。

関数に型ヒントを追加しても、コンパイル時にチェックされません。

Clojure は Lisp であるため、コンパイル時にマクロを使用して好きなことを行うことができ、マクロは独自の型システムを作成できるほど強力です。Lisp Typed RacketQiの型システムを作成した人もいます。これらの型システムは、「通常の」言語の型システムと同じくらい強力です。

さて、それが可能であることはわかりましたが、Clojure にはそのようなオプションの型システムがありますか? 答えは現在ノーですが、型システムを実装するために使用できるロジック エンジン (core.logic) がありますが、作成者は (まだ) その方向には取り組んでいません。

于 2011-06-12T19:46:14.593 に答える
2

Clojureにオプションの型システムを追加するライブラリがあり、

http://typedclojure.org/

根拠

静的型付けには、よく知られた利点があります。たとえば、静的に型付けされた言語は、多くの一般的なプログラミング エラーを可能な限り早い段階 (コンパイル時) に検出します。型は、ほとんどの場合、既存の手書きのドキュメントを補強する (マシン チェック可能な) ドキュメントの優れた形式としても機能します。

静的型チェック (動的型付け) のない言語には、他の利点があります。必須の静的型付けの厳格な厳格さがなければ、ラピッド プロトタイピングに役立つ、より柔軟で寛容なイディオムを提供できます。プログラムが大きくなるにつれて、静的型チェックの利点が望まれることがよくあります。

この作業により、動的型付け言語である Clojure に静的型チェック (およびその利点の一部) が追加されますが、言語を特徴付けるイディオムは保持されます。静的および動的に型付けされたコードを混在させることができるため、プログラマーはより適切な方を使用できます。

于 2016-11-23T03:29:41.327 に答える