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=>
clojureはclojureのデータ型を操作する範囲内では、
基本的にデータの「破壊的変更」を許していません。
データは全て「変更不可」となっています。
式を評価して返却されるデータは、全て「新しいデータ」なのです。
無論、毎回全てのデータのコピーを生成していたらメモリがいくらあっても足りませんが、
clojureはデータの使いまわしに気を遣っているそうなので、
そこらへんはうまくやってくれています。
そして「変更不可」なデータを扱うと、
「関数型言語」という新しいプログラミングパラダイムが見えてくるのですが、
それはまたいずれまとめられたらまとめようと思います。
尚、clojureは破壊的変更がまったくできないわけではありません。
後のエントリで紹介する予定ですが、
javaクラスから生成されたオブジェクトを扱う場合は、
いつものjavaオブジェクトを操作する感じ(つまり破壊的操作)になります。
「変更不可」というのがしっくりこなければjavaに逃げ込むこともできますので安心かもしれません。