Kamuycikap - SentenceDataBase

日々の勉強の記録を気分で書き綴るブログ

Emacs Lisp: 再帰とリスト

Emacs Lisp: 再帰とリスト

関数引数として、リストが指定された場合、全て再帰的に処理するには?

再帰の定石(リストバージョン)
●終了条件を調べ、終了なら初期値を返す
●リストの最初の要素に対して処理をする
●処理結果を引数として自分自身を呼び出す

渡されたリストの要素を全て加算する。

(defun sum (l)
  (cond
   ((null l) 0)
   (t (+ (car l) (sum (cdr l))))))

(sum '(1 3 7)) ;; => 11


リストの要素を置き換える関数replを作る

(defun repl (lst old new)
  (cond
   ((null lst) nil)
   ((eq (car lst) old)
    (cons new (repl (cdr lst) old new)))
   (t (cons (car lst) (repl (cdr lst) old new)))))

(repl '(dog pig dog) 'dog 'rat) ;; => rat pig rat

関数del
第二引数のリストの中から、第三引数のxと同じ要素を全て削除する。

(defun del (x lst)
  (cond
   ((null lst) nil)
   ((eq (car lst) x) (del x (cdr lst)))
   (t (cons (car lst) (del x (cdr lst))))))

(del 'pig '(rat pig dog pig))