結合をもういちど。
「とあるxyzzy使い」さんの指摘され、consの理解を改める。
ここを見て、お勉強。
たぶん、こういうのが正しい理解
(cons 1 3) ;; -> (1 . 3)
これは「ドット対」と呼ばれる形となる。ドット対はリストである。
ただし、(1 . 3)という形は直接「評価」はできない。
(1の部分が関数ならば話は別だが)つまり、
「ドット対」の名の通り3つ以上のアトム(要素=ここでは1とか3とか)を、「.」でつなぐことはできない
;; -> 右側には結果を表示
;; ドット対の作成
(cons 1 3) ;; -> (1 . 3)
;; 直接評価はできない(lisp-interaction-modeでCtrl+jを押して確認)
(1 . 3) ;; -> 不正な関数です:1(エラー)
(ただし、ドット対は入れ子にすることができる)
さて、次の場合はこう動く。
(1 . 3 . 5) ;; -> ドットのみのトークンです(エラー)
;; (1 3 5) はドット対を使うとそれぞれ次のように表現できる
;; → (1 3 (5 . nil))
;; → (1 (3 . (5 . nil)))
;; → (1 . (3 . (5 . nil)))
単なる結合の場合はappendを使うらしい
(cons 1 '(3 5)) ;; -> (1 3 5) を返す。(1 . (3 5))ではない
;; 内部では全てドット対で処理されているのかもしれないが、
;; 少なくとも見かけ上はドット対を返さない
こういう動きをするのか、
(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号が出てた。
インタビューが面白い。