2008年1月8日火曜日

Chapter 12 They Called It LISP for a Reason: List Processing

前説
"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 件のコメント: