by shigemk2

当面は技術的なことしか書かない

リスト遊び 8-7 削除!

前回
リスト遊び 8-6 連結! - by shigemk2

(setq zoo '(3 2 1 3 2 1))
(3 2 1 3 2 1)
(delq 1 zoo)
(3 2 3 2)
zoo
(3 2 3 2)

(setq zoo '(1 2 1 3))
(1 2 1 3)
(delq 1 zoo)
(2 3)
zoo
(1 2 3)
(setq zoo '(1 2 1 3))
(1 2 1 3)
;; また例によってsetqを併用する必要がある
(setq zoo (delq 1 zoo))
(2 3)
zoo
(2 3)

(defun delq* (x lst)
  (let ((this lst) prev)
       (while this
	 (cond
	  ((eq (car this) x)
	   (cond
	    ((null prev)
	     (setq lst (cdr this)))
	    (t (setcdr prev (cdr this)))))
	  (t (setq prev this)))
	 (setq this (cdr this)))
       lst))
delq*
(setq zoo '(1 2 1 3))
(1 2 1 3)
(delq* 1 zoo)
(2 3)
zoo

(defun uniq (lst)
  (let ((ptr lst))
    (while ptr
      (setcdr ptr (delq (car ptr) (cdr ptr)))
      (setq ptr (cdr ptr)))
    lst))
uniq
(uniq '(1 2 3 1 2 3 1 2 3 4))
(1 2 3 4)

副作用を持つ関数は危険である。関数はなるべく副作用のないように作る
セルの利用効率を上げる必要があるなら、副作用のある関数を活用する。
ただし、完全に理解してから使うこと。

リスト遊び―Emacsで学ぶLispの世界 (ASCII SOFTWARE SCIENCE Language)

リスト遊び―Emacsで学ぶLispの世界 (ASCII SOFTWARE SCIENCE Language)