24

私はClojureを学習中ですが、言語設計の決定を理解できません。Clojureのような不変の文字列を持つ言語で、キーワードとシンボルのデータ型も必要なのはなぜですか?文字列には、オプションの名前空間とメタデータ、およびこれらすべてのものを含めることはできませんか?不変の文字列の場合、比較はIDベースにもなり得ますね。

または、Javaとの相互運用はClojureに必須であるため、少なくともJavaString型とKeywordSymbolデータ型が必要です。

Clojureは「純度」に非常に重点を置いており、他の面では物事をシンプルに保つように見えるため、この文字列/キーワード/記号の「トリコトミー」は特に奇妙だと思います。

4

2 に答える 2

16

それらは言語内で非常に異なる役割を果たします。

  • 変数は、ものに名前を付けるために使用されます。それらは実装されrunnable、関数を呼び出すために直接使用できます。文字列を実行することはできません。
  • キーワードはそれ自体が名前であり、マップで検索します。これらは、Clojure がその「データ駆動型」の特徴を維持するのに本当に役立ちます。文字列は、マップで自分自身を検索するために必要なインターフェイスを実装していません。
  • 文字列は単なる文字列です。彼らは必要なことをするだけで、それ以上のことはしません。

Clojure の設計における中核となる原則の 1 つは、ホスト プラットフォームを受け入れることでした。したがって、Clojure では文字列は Java 文字列であり、Java 文字列を一部のプラットフォームでラップする必要はありません。convert-to-clojure-stringそれをClojureエコシステムに入れるために機能します。これには、変更されていない Java 文字列と数値型を使用する必要がありました。キーワードとシンボルは、Clojure によって追加された新しい構造であるため、残りの Java エコシステムから便利な方法でアクセスできるようにするだけで済みます。シンボルとキーワードは、単にインターフェイスを実装するクラスであることによってアクセス可能になります。当初、新しい言語が JVM エコシステムで成功するためには、Java を完全に採用し、「インピーダンスの不一致」を最小限に抑える必要があると考えられていました (バズワードで申し訳ありません)。この目標なしで必要とされてきました。

編集:


defシンボルを自分自身に ing することで、シンボルをキーワードに変えることができます

user> a
; Evaluation aborted.
user> :a
:a
user> (def a 'a)
#'user/a
user> a
a
user> 

キーワードはそれ自体に評価されます

于 2012-07-25T17:48:44.873 に答える
4

Clojure は「純粋さ」よりも「実用性」 (それが正しい言葉であれば) を重視していると思います。これは、Clojure がリストに加えてマップ、ベクター、およびセットの構文を持ち、それを使用して言語を定義しているという事実に見ることができます。純度 (IMO) にもっと関心があるSchemeでは、リストの構文しかありません。

Arthur Ulfeldt が指摘しているように、文字列、キーワード、および記号にはそれぞれ意図されたユース ケースがあります。意図したとおりに使用すると、Clojure コードが読みやすくなります。これは、セマンティック マークアップを追加する HTML 5 で起きていることと似ています。<article>やのようなもので、 HTML 4でやで<section>表すことができます。<div class="article"><div class="section">

ああ、文字列を同一性だけで比較するのは間違っています。これは、インターンされた文字列に対してのみ機能することが保証されています。また、あまり多くの文字列をインターンする必要はありません。いわゆる permgen に格納されるためです。これはサイズがかなり制限されており、ガベージ コレクションが行われることはありません。

于 2012-07-25T19:56:51.213 に答える