この情報はCommon LispやSchemeを知っているプログラマーのために提供されている。

  • Clojureは大文字と小文字の違いを気にする

  • ClojureはLisp-1である

  • ()はnilとは異なる

  • readerは副作用を起こさない

  • キーワードはシンボルではない

  • シンボルはストレージではない (Varを参照)

  • nil はシンボルではない

  • t はシンタックスに含まれない。 true を使用する

  • 現在、ユーザープログラムがリードテーブルにアクセスすることはできない

  • let は逐次的に束縛を行う

  • do はループ構造ではない

  • 末尾呼び出し最適化はない。 recur を使用する。

  • シンタックスクォートはシンボルの解決を行うため、 `x は 'x と異なる。

  • ` は自動的にgensymを行う。

  • ~ はアンクォートで、 ',' は空白である

  • マップ、ベクター、セットに対してリーダーのシンタックスが定義されている

  • cons, first および rest は具体的なコンスセルに対してではなく、シーケンス抽象を操作する。

  • ほとんどのデータ構造はイミュータブルである。

  • ラムダは fn であり、アリティによるオーバーロードをサポートしている。

  • = は等価性を示す述語である

  • グローバルなVarは、動的(dynamic)と宣言されている場合には、ローカルなシンボルの束縛に干渉することなく動的に再束縛することができる。動的な束縛とレキシカルな束縛を区別するための特別な宣言などは必要ない。ClojureはLisp-1であるため、グローバルな関数は動的に再束縛することができる。

  • letrec、labels や flet は存在しない - 自己参照には (fn name [args]…​) を使用する。相互参照には letfn を使用する。

  • Clojure では nil は 「無」 を意味する。どのような型においてもが値がないこと示し、リストやシーケンス特有のものではない。

  • 空のコレクションは nil とは明確に異なる。Clojureは nil と '() を同値として扱わない。

  • false はboolean型でとりうる2つの値のうちのひとつを示し、もうひとつの値は true である。

  • リスト以外にもコレクションは存在する。空のコレクションのインスタンスを作ることができ、いくつかはリテラルをサポートしている ([]、 {}、 および ())。よって、空のコレクションを示すセンチネルな値は存在しない。

  • Schemeから来た場合、 nil は#fの概念に最も似ているかもしれない。

  • Clojureにおける大きな違いはシーケンスである。シーケンスは特定のコレクションではなく、特に必ずしも具体的なリストではない。 seq を呼び出して空のコレクションからシーケンスを要求した場合、 nil を返し、「シーケンスを作ることができない」ということを示す。シーケンスの最後の要素に対して rest を要求した場合、 別の論理的なシーケンスを返す。 シーケンスが空かどうかはそれに対して seq を呼び出すことによって判定できる。シーケンスとシーケンスのプロトコルを lazy な(遅延評価される)ものにすることが可能になる。

  • いくつかのシーケンス関数は、pair/cons (リスト) に対してのみ操作を行い、空リストを意味するセンチネル値 ('() と nil) を返すという点がSchemeやCLの関数に対応する。Clojureが返す値は、具体的な空のコレクションではなく、むしろ別の論理的なシーケンスであるという点が異なる。いくつかのシーケンス関数はScheme/CLに相当するものが存在せず、Haskell/MLライクな関数である。これらの関数のいくつかが無限の、または計算されたシーケンスを返し、Scheme/CLにおける具体的なデータ構造とはあまり似ていない。

  • コレクション/データ構造とseq/iterationを区別することは有用だ。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によるコレクションの実装の抽象化

扱う - コンス と ベクター

扱う - ペア

扱わない - イテレーターによるコレクション実装の抽象化

シングルトンの空リスト値があるか

ない - 具体的なコレクション型ごとに空のコレクションの値が存在しうる

nil

'()

ない

シーケンスの終端の戻り値:

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

nil

'()

false

ホスト環境の null:

nil

NA

NA

NA

ホスト環境の true:

true (boxed)

NA

NA

NA

ホスト環境の false:

false (boxed)

NA

NA

NA