ホーム‎ > ‎リファレンス‎ > ‎

他のLispとの違い

Differences with other Lisps

他のLispとの違い

This information is provided for programmers familiar with Common Lisp or Scheme.
この情報はCommon LispやSchemeに慣れたプログラマー向けである。

  • Clojure is case sensitive
  • Clojureはcase sentitive(大文字と小文字を区別する)である。
  • Clojure is a Lisp-1
  • ClojureはLisp-1である(関数と変数に区別がない)
  • () is not the same as nil
  • ()(空リスト)はnilと同じではない
  • The reader is side-effect free
  • リーダー(読み取り機)には副作用がない
  • Keywords are not Symbols
  • キーワードはシンボルではない
  • Symbols are not storage locations (see Var)
  • ンボルはデータを格納する場所ではない(Varを見よ)
  • nil is not a Symbol
  • nilはシンボルではない
  • t is not syntax, use true
  • 文法内に t はない、trueを使うこと
  • The read table is currently not accessible to user programs
  • 現在のところリードテーブルはユーザープログラムからアクセスできない(リーダーマクロが使えない)
  • let binds sequentially
  • let は順番にバインドしていく
  • do is not a looping construct
  • doは繰り返し構文ではない
  • There is no tail-call optimization, use recur.
  • 末尾呼び出し最適化は行われない、recurを使うこと
  • syntax-quote does symbol resolution, so `x is not the same as 'x.
  • シンタックスクオートはシンボルの解決ではない、なので`xは'xと同じではない
  • ` has auto-gensyms.
  • `は自動的にシンボルを生成する
  • ~ is unquote ',' is whitespace
  • ~はクオート解除 ','は空白文字と同じ
  • There is reader syntax for maps and vectors
  • マップとベクターのためのリーダーシンタックスがある
  • consfirst and rest manipulate sequence abstractions, not concrete cons cells
  • cons, first及びrest関数は実際にコンスセルを操作するのではなくシーケンスの抽象を操作する
  • Most data structures are immutable
  • ほとんどのデータ構造は変更不可能である
  • lambda is fn, and supports overloading by arity
  • lambdaはfnで、アリティ(引数の個数)によるいオーバーロードをサポートしている
  • = is the equality predicate
  • = は等しいという述語である
  • All (global) Vars can be dynamically rebound without interfering with lexical local bindings. No special declarations are necessary to distinguish between dynamic and lexical bindings. Since Clojure is a Lisp-1, (global) functions can be dynamically rebound.
  • 全ての(大域)変数はレキシカルローカルバインディングに妨げられることなく動的に再バインドされる。ダイナミックバインディングとレキシカルバインディングを区別するためには特別な宣言は不要である。ClojureはLisp-1なので、(大域)関数は動的に再バインドされる。
  • No letrec, labels or flet - use (fn name [args]...) for self-reference, letfn for mutual reference.
  • letrec, labels または flet はないので自己参照のためには(fn name [args]...)を使う、letfnは相互参照である。
  • In Clojure nil means 'nothing'. It signifies the absence of a value, of any type, and is not specific to lists or sequences.
  • Clojureではnilは'何もない'を意味する。nilはあらゆる型について、値が存在しないことを意味し、それはリストやシーケンスに特有というものではない。
  • Empty collections are distinct from nil. Clojure does not equate nil and '().
  • 空のコレクションはnilとは区別される。Clojureではnilと'() (空リスト)は等しくない。
  • false means one of the two possible boolean values, the other being true
  • falseは二つあるboolean値の片方を意味する。もう片方はtrueである。
  • There is more to collections than lists. You can have instances of empty collections, some of which have literal support ([], {}, and ()). Thus there can be no sentinel empty collection value.
  • リストの他にもコレクションは存在する。空のコレクションのインスタンスを得ることができる。そのうちのいくつかはリテラルのサポートがある([], {}, and ())。なので、空のコレクションを示すセンチネル値(※特別の意味を持たせた値)は存在しない。
  • Coming from Scheme, nil may map most closely to your notion of #f.
  • Schemeから来た人にとっては、nilはSchemeで言うところの #fに近いものと考えてよいだろう。
  • A big difference in Clojure, is sequences. Sequences are not specific collections, esp. they are not necessarily concrete lists. When you ask an empty collection for a sequence of its elements (by calling seq) it returns nil, saying "I can't produce one". When you ask a sequence on its last element for the rest it returns another logical sequence. You can only tell if that sequence is empty by calling seq on it in turn. This enables sequences and the sequence protocol to be lazy.
  • Clojureと他のLispの最も大きな違いはシーケンスである。シーケンスは特定のコレクションではないし、特に、具体的なリスト構造である必要もない。もし空のコレクションに対して(seq関数を呼んで)シーケンスを得ようとすると「作れません」という意味でnilが返される。もしあるシーケンスの最後の要素についてrestを得ようとするとシーケンスは他の論理シーケンスを返す。そのシーケンスが空かどうかは次にseq関数を呼び出してみないとわからない。これによってシーケンスとシーケンスのプロトコルを遅延評価にできる。
  • Some of the sequence functions correspond to functions from Scheme and CL that there manipulated only pairs/conses ('lists') and returned sentinel values ('() and nil) that represented 'empty' lists. The Clojure return values differ in not returning specific empty collections, but rather another logical sequence. Some of the sequence functions have no counterpart in Scheme/CL, and map to Haskell/ML-like functions. Some of those functions return infinite or calculated sequences, where the analogy to concrete data-structures like Scheme/CL lists is tenuous at best.
  • いくつかのシーケンス関数はSchemeやCommon Lispのペアやコンスセル('リスト')だけを操作し特別な値('()とnil)を、空のリストを表す値として返す関数に対応している。Clojureのリターン値はそれらとは異なり特別な空のシーケンスを返さない代わりに別の論理シーケンスを返す。いくつかのシーケンス関数はSchemeやCommon Lispには対応するものがなく、HaskellやML風の関数に関連付けることができる。こういった関数のうちいくつかは無限シーケンスまたは計算されたシーケンスを返す。そういうシーケンスは明確なデータ構造をもつSchemeやCommon Lispのリストではどう頑張っても弱い類似性しか持たせることができない。
  • It helps to distinguish collections/data-structures and seqs/iteration. In both CL and Scheme they are conflated, in Clojure they are separate.
  • 上記の特徴はコレクション/データ構造とシーケンス/イテレーションを区別するのに役立つ。Common LispでもSchemeでもそれらは融合してしまっているが、Clojureでは分離している。

Clojure
Common Lisp
Scheme
Java
Has nil?
nilがあるか?
nil - means 'nothing'
nilがある - 「何もない」を意味する
nil - means false or empty list
nilがある - falseまたは空リストを意味する
-
- 
null
null
Has true?
trueがあるか? 
true
true
-
-
#t
#t
true (primitive)
true (基本型)
Has false?
falseがあるか?
false
false
-
-
#f
#f
false (primitive)
false (基本型)
Conditionals distinguish:
条件判断は何を元に行われるか:
nil or false/ everything else
nil またはfalse / それ以外の全て
nil/non-nil
nil/非nil
#f/non-#f
#f/非#f
false/true
false/true
List/sequence library manipulates distinguished concrete type(s)?
リスト/シーケンスライブラリは区別できる明確な型を操作するか?
No - seq abstraction with many collection implementations
しない - 多数のコレクション実装によるシーケンスの抽象化
Yes - cons and vector
する - cons と ベクター
Yes - pair
する - ペア
No - Iterator abstraction with many collection implementations
しない - 多数のコレクション実装によるイテレータ抽象化
Singleton empty-list value?
単一の空リストを示す値があるか?
No - can have distinct empty values of concrete collection types
ない- 明確なコレクション型に明示的な空を表す値を取ることはできる
nil
nilを使う
'()
'()を使う
No
ない
End-of-sequence returns:
シーケンスの末尾は何を返すか:
a logical sequence for which seqreturns nil
seq関数に与えるとnilを返すような論理シーケンス
nil
nil
'()
'()
false
false
Host null:
nullを受け取ると:
nil
nil
NA
そういう操作はない
NA
そういう操作はない
NA
そういう操作はない
Host true:
trueを受け取ると:
true (boxed)
(boxされた)true
NA
そういう操作はない
NA
そういう操作はない
NA
そういう操作はない
Host false:
falseを受け取ると:
false (boxed)
(boxされた)false
NA
そういう操作はない
NA
そういう操作はない
NA
そういう操作はない
Comments