Clojure

他のLispとの違い

この情報は、Common LispまたはSchemeに精通しているプログラマー向けです。

  • Clojureは大文字と小文字を区別します

  • ClojureはLisp-1です

  • () は nil と同じではありません

  • リーダーは副作用がありません

  • キーワードはシンボルではありません

  • シンボルは記憶場所ではありません(Varを参照)

  • nil はシンボルではありません

  • t は構文ではありません。true を使用してください

  • リードテーブルはユーザープログラムからアクセスできません

  • let は順次的にバインドします

  • do はループ構文ではありません

  • 末尾呼び出しの最適化はありません。recur を使用してください。

  • シンタックスクオートはシンボル解決を行うため、`x'x と同じではありません。

  • ` は自動ジェンシムを持ちます。

  • ~ はアンクオート、, は空白です

  • マップ、ベクター、セットのリーダー構文があります

  • consfirstrest は具体的なコンスセルではなく、シーケンスの抽象概念を操作します

  • ほとんどのデータ構造は不変です

  • ラムダは fn で、アリティによるオーバーロードをサポートします

  • = は等価述語です

  • グローバル変数は、レキシカルなローカルバインディングに干渉することなく、動的に再バインドできます(動的として宣言されている場合)。動的バインディングとレキシカルバインディングを区別するために特別な宣言は必要ありません。 ClojureはLisp-1であるため、(グローバル)関数は(動的としてマークされている場合)動的に再バインドできます。

  • letreclabelsflet はありません。自己参照には (fn name [args]…​) を、相互参照には letfn を使用してください。

  • Clojureでは、nil は「何もない」ことを意味します。 これは、任意の型の値が存在しないことを示し、リストまたはシーケンスに固有のものではありません。

  • 空のコレクションは nil とは異なります。 Clojureは nil'() を同等とはみなしません。

  • false は、2つの可能なブール値のうちの1つを意味し、もう1つは true です

  • コレクションにはリスト以上のものがあります。 空のコレクションのインスタンスを持つことができ、その一部はリテラルサポート([]{}())を持ちます。 したがって、センチネルの空のコレクション値を持つことはできません。

  • Schemeから来た場合、nil#f の概念に最も近いでしょう。

  • Clojureの大きな違いはシーケンスです。 シーケンスは特定のコレクションではなく、特に具体的なリストである必要はありません。 空のコレクションに要素のシーケンスを要求すると(seq を呼び出すことによって)、 `nil` を返して「生成できません」と示します。 シーケンスの最後の要素に `rest` を要求すると、***別の論理シーケンス***が返されます。そのシーケンスが空かどうかを確認するには、順番に `seq` を呼び出すしかありません。 これにより、シーケンスとシーケンスプロトコルを*遅延*させることができます。

  • シーケンス関数のいくつかは、SchemeとCLの関数に対応しており、ペア/コンス( 'リスト' )のみを操作し、 '空の'リストを表すセンチネル値( `'()`と `nil` )を返しました。 Clojureの戻り値は、特定の空のコレクションを返すのではなく、別の論理シーケンスを返す点が異なります。 シーケンス関数のいくつかは、Scheme / CLに対応するものがないため、Haskell / MLのような関数にマップされます。 これらの関数のいくつかは、無限または計算されたシーケンスを返します。Scheme / CLリストのような具体的なデータ構造との類似性は、せいぜい希薄です。

  • コレクション/データ構造とseqs /反復を区別すると役立ちます。 CLとSchemeの両方でそれらは統合されていますが、Clojureでは分離されています。

Clojure Common Lisp Scheme Java

nilがありますか?

nil - 「何もない」ことを意味します

nil - falseまたは空のリストを意味します

-

null

trueがありますか?

true

-

#t

true(プリミティブ)

falseがありますか?

false

-

#f

false(プリミティブ)

条件式は区別します

nilまたはfalse / その他すべて

nil / nil以外

#f / #f以外

false / true

リスト/シーケンスライブラリは、区別された具体的な型を操作しますか?

いいえ - 多くコレクション実装を持つseq抽象化

はい - consとvector

はい - pair

いいえ - 多くコレクション実装を持つIterator抽象化

シングルトン空リスト値?

いいえ - 具体的なコレクション型の異なる空の値を持つことができます

nil

'()

いいえ

シーケンスの終わりは返します

**seq** がnilを返す論理シーケンス

nil

'()

false

ホストnull

nil

該当なし

該当なし

該当なし

ホストtrue

true(ボックス化)

該当なし

該当なし

該当なし

ホストfalse

false(ボックス化)

該当なし

該当なし

該当なし