« September 2014 | Main | August 2015 »

October 13, 2014

プログラミングを始めるには(36)

前囘からLispのデータについて書き始めたが、Lispにおける整數型がどうとか、文字列型がどうとか、そんなことを順序立てて、包括的に、眞面目に書く氣はない。そういうことは、Lispというキーワードでググって眞っ先に出てくるようなホームページやブログに書いてあれば良いのであって、私の言說には不要だ。

最近慌てて作ったプログラムで、非常に初步的なバグを作ってしまった。

(setq list-1 '("1" "3" "2"))
("1" "3" "2")

(setq list-2 '("c" "b" "a"))
("c" "b" "a")

(setq list-3 (nconc list-2 list-1))
("c" "b" "a" "1" "3" "2")

list-1
("1" "3" "2")

list-2
("c" "b" "a" "1" "3" "2")

list-3
("c" "b" "a" "1" "3" "2")

(sort list-1 'string<)
("1" "2" "3")

(sort list-2 'string<)
("1" "2" "3" "a" "b" "c")

(sort list-3 'string<)
("c")

list-1
("1" "2" "3" "a" "b" "c")

list-2
("c")

list-3
("c")

上に示したのは起こした問題のポイントである。

list-1list-2にそれぞれリストデータを設定し、破壞的リスト操作のnconcを使用して2つのリストを1つにまとめると、list-1list-2の内容が變わってしまう。nconcによって變わったのは、list-2の最後の要素のcdrnilからlist-1(の最初の要素)になっただけだ。よってlist-2list-3の内容が同じになってしまっている。この場合、list-2list-3eqである。

これはリストデータがコンスセルによって成り立っているということを考えれば當たり前であるが、シンボルはリストデータを構成するコンスセルのうちの1個だけを指し示すという點が重要だ。

破壞的リスト操作というのはリストを壞すという意味ではなく、コンスセルのcdrを變更するという意味で破壞的と言っている。それはlist-1list-2list-3carが變わっていないことを見れば分かる。

| | Comments (0) | TrackBack (0)

« September 2014 | Main | August 2015 »