"There Is No List"
特になし。
Functional Programming and Lists
appendがシェアしているということ。
CL-USER> (let* ((a (list 1 2))
(b (list 3 4))
(c (append a b)))
(print a)
(print b)
(print c)
(setf (car b) 30)
(print b)
(print c))
(1 2)
(3 4)
(1 2 3 4)
(30 4)
(1 2 30 4)
(1 2 30 4)
CL-USER>
なんと。そういうものなのか。
"Destructive" Operations
同じような例があった。orz
- destructive operationsには、二種類ある。for-side-effect と recycling である。
- for-side-effectは、SETFとかVECTOR-PUSHとか。
- これらはそもそも関数プログラミングしようとするときは使わない。
- recyclingは、関数プログラミングの中でも使う。recylingは効率を上げるために使われる。
- 上の例も、SETFを使用しないかぎり、オブジェクトをシェアしていても問題ない。
- recyclingを利用するときは、それまでに使っていたobjectsはそれ以降使わないときがよい。
うーん。いちいち一つ一つの関数について、どうrecyclingしているかとかを知らねばならんのか。
嫌なら、recyclingな関数は使わない、効率を求めたいなら使え、ということかな。
Combining Recycling with Shared Structure
ああ、それでdestructiveな操作をしたらとにかくSETFしちまえってことなのか。
CL-USER> (defparameter *list* (list 4 3 2 1))
*LIST*
CL-USER> (sort *list* #'<)
(1 2 3 4)
CL-USER> *list*
(4)
CL-USER>
おお。なんだか、すごい。
CLのdestructiveとは、単にもとのobjectsを(代入のように)書き換えちゃいますよ、ということだけではなく、効率がいいようにバラバラにして使ってそのまんまですよってことなんですね。スカーだ。
List-Manipulation Functions
Other Structures
特になし。
0 件のコメント:
コメントを投稿