clojure備忘録[clojureの基本的な関数 その1(cons関数)]

まずはcons関数です。
前エントリで触れた通り、第1引数を第2引数のリストの先頭に挿入した、新しいリストを返却します。

表記

使用方法は次の通りです。

(cons x seq)

xは先頭に挿入されるデータ、seqは元になるリストです。
実際に使用してみましょう。

user=> (cons 1 '(2 3))
(1 2 3)
user=> 

第2引数のリスト生成に特殊形式quoteが使用されている事以外は特に何もないです。
生成されたリストの先頭に、第1引数の1が挿入されたリストが返却されています。
但し、元のリストに「破壊的変更」が起きたわけではありません。
次のコードで確認できます。

user=> (def src-list '(2 3))  ;リストを生成しておく
#'user/src-list
user=> src-list               ;生成されたリストを確認。
(2 3)
user=> (cons 1 src-list)      ;生成したリストの先頭に1を挿入したリストを返却
(1 2 3)
user=> src-list               ;元のリストが変更されていない事を確認
(2 3)
user=> 

clojureclojureのデータ型を操作する範囲内では、
基本的にデータの「破壊的変更」を許していません。
データは全て「変更不可」となっています。
式を評価して返却されるデータは、全て「新しいデータ」なのです。
無論、毎回全てのデータのコピーを生成していたらメモリがいくらあっても足りませんが、
clojureはデータの使いまわしに気を遣っているそうなので、
そこらへんはうまくやってくれています。
そして「変更不可」なデータを扱うと、
関数型言語」という新しいプログラミングパラダイムが見えてくるのですが、
それはまたいずれまとめられたらまとめようと思います。


尚、clojureは破壊的変更がまったくできないわけではありません。
後のエントリで紹介する予定ですが、
javaクラスから生成されたオブジェクトを扱う場合は、
いつものjavaオブジェクトを操作する感じ(つまり破壊的操作)になります。
「変更不可」というのがしっくりこなければjavaに逃げ込むこともできますので安心かもしれません。