clojure備忘録[clojureの基本的な関数 その0]

最小構成のLispは次の要素があれば実装可能らしいです。
(私は突っ込んで検証したことがないのですが。。)


・アトム
・リスト
・5つの基本関数
・4種の特殊形式
今回説明するのはこの中の「基本関数」についてです。
Lispの基本関数は歴史的な背景もあって、
ちょっとイメージしにくい名前の関数があったりしますが、
clojureはこの伝統を破り、ある程度わかりやすい名前になっています。
個人的には伝統的な名前でもよかったんじゃないかなぁと思いますけども。


Lispの基本関数は、C言語でいうならメモリの操作に相当するぐらい、
非常に重要な要素なので、clojureにおける関数と対比しつつ、
説明をしていきます。


まずは下の表を見てください。

Lisp clojure 処理概要
cons cons 第1引数のデータを、第2引数のリストの先頭に挿入した、新しいリストを返却する。
car first リストの先頭要素を返却する。
cdr rest リストの2つ目以降の全ての要素を、新しいリストとして返却する。
eq = 値が等しいかどうかを返却する。
atom *不明* 引数のS式がアトムかどうかを返却する。
clojureでは相当する関数がわからなかった。。

consは、「construct」という単語の先頭4文字が由来です。
carとcdrに至っては何が何だかさっぱりですが、
Lispが誕生した初期は、Lispマシンと呼ばれる専用機が存在していました。
carとcdrはその時のハードウェアの用語である、
「Contents of the Address part of the Register」という名称の頭文字と、
「Contents of the Decrement part of the Register」という名称の頭文字が由来となっています。


Lispのデータを扱う為の基本関数なので概念的にも非常に重要です。
非常に重要なのですが、なぜ重要なのかをやり始めると、
clojureで実用的なコードを書くフェーズがどんどん遠のいていって心が折れそうになるので、
clojureのreplでcons、first、rest、=、の各挙動を確認するに留めます。
もし本質的なところを知りたい場合はSICPをお薦めします。
(いやホントに冗談でなく、根っこを知りたい場合はSICPはマジでお薦めです。)


ではcons関数から説明していきます。