この情報は、Common LispまたはSchemeに精通しているプログラマー向けです。
Clojureは大文字と小文字を区別します
ClojureはLisp-1です
()
は nil と同じではありません
リーダーは副作用がありません
キーワードはシンボルではありません
シンボルは記憶場所ではありません(Varを参照)
nil
はシンボルではありません
t
は構文ではありません。true
を使用してください
リードテーブルはユーザープログラムからアクセスできません
let
は順次的にバインドします
do
はループ構文ではありません
末尾呼び出しの最適化はありません。recur
を使用してください。
シンタックスクオートはシンボル解決を行うため、`x
は 'x
と同じではありません。
`
は自動ジェンシムを持ちます。
~
はアンクオート、,
は空白です
マップ、ベクター、セットのリーダー構文があります
cons
、first
、rest
は具体的なコンスセルではなく、シーケンスの抽象概念を操作します
ほとんどのデータ構造は不変です
ラムダは fn
で、アリティによるオーバーロードをサポートします
=
は等価述語です
グローバル変数は、レキシカルなローカルバインディングに干渉することなく、動的に再バインドできます(動的として宣言されている場合)。動的バインディングとレキシカルバインディングを区別するために特別な宣言は必要ありません。 ClojureはLisp-1であるため、(グローバル)関数は(動的としてマークされている場合)動的に再バインドできます。
letrec
、labels
、flet
はありません。自己参照には (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(ボックス化) |
該当なし |
該当なし |
該当なし |