結合をもういちど。

「とあるxyzzy使い」さんの指摘され、consの理解を改める。
ここを見て、お勉強。
たぶん、こういうのが正しい理解
(cons 1 3) ;; -> (1 . 3)
これは「ドット対」と呼ばれる形となる。ドット対はリストである。
ただし、(1 . 3)という形は直接「評価」はできない。
(1の部分が関数ならば話は別だが)つまり、


;; -> 右側には結果を表示
;; ドット対の作成
(cons 1 3) ;; -> (1 . 3)
;; 直接評価はできない(lisp-interaction-modeでCtrl+jを押して確認)
(1 . 3) ;; -> 不正な関数です:1(エラー)
「ドット対」の名の通り3つ以上のアトム(要素=ここでは1とか3とか)を、「.」でつなぐことはできない
(ただし、ドット対は入れ子にすることができる)

(1 . 3 . 5) ;; -> ドットのみのトークンです(エラー)
;; (1 3 5) はドット対を使うとそれぞれ次のように表現できる
;; → (1 3 (5 . nil))
;; → (1 (3 . (5 . nil)))
;; → (1 . (3 . (5 . nil)))
さて、次の場合はこう動く。

(cons 1 '(3 5)) ;; -> (1 3 5) を返す。(1 . (3 5))ではない
;; 内部では全てドット対で処理されているのかもしれないが、
;; 少なくとも見かけ上はドット対を返さない
単なる結合の場合はappendを使うらしい

(append '(1 3) '(5 7)) ;; -> (1 3 5 7)
;; 直接要素を与えるとドット対を返すらしい
(append '(1 3) 7) ;; -> (1 3 . 7)
;; 1を取り出す
(car (append '(1 3) 7)) ;; -> 1
;; (3 . 7)を取り出す
(cdr (append '(1 3) 7)) ;; -> (3 . 7)
;; 3を取り出す
(car (cdr (append '(1 3) 7))) ;; -> 3
(cadr (append '(1 3) 7)) ;; -> 3
;; 7を取り出す
(cddr (append '(1 3) 7)) ;; -> 7
(cdr (cdr (append '(1 3) 7))) ;; -> 7
こういう動きをするのか、
考える機会を作ってくれた「とあるxyzzy使い」さんに感謝♪

のどが痛い。風邪ひいたようだ。

るびま5号が出てた。
インタビューが面白い。