Tips::CommonLisp


ドット対

ドットの後ろにnilがくる場合は,ドットとnilを省略してもよい。
だから
(cons 'a '(b c d))
の結果は
(a . (b c d))
とは書かずに
(a b c d)
と書くのが普通。

一般的なリスト

(a b) : |a|/| --> |b|nil|
という形。
> (cdr '(a b))
(b)

ドット対

(a . b) : |a|b|
という形をしている。
> (cdr '(a . b))
b

Hello world

(format t "Hello, World\n") <== C-j を入力
Hello, World
nil


loopの条件実行

1~10までの偶数の表示
(loop for i from 1 to 10 do (when (evenp i) (print i)))


ファイル内の全行表示

(defun mycat (filename)
  (with-open-file (in filename :direction :input)
    (loop for line = (read-line in nil)
         while line do (format t "~a~%" line))))

do,do*の解釈

(do ((変数1 初期値1 ステップ1)
     (変数2 初期値2 ステップ2)
     ...
     (変数2 初期値2 ステップ2))
    (条件 出口 ...)
  本文1
  ...
  本文n)

(prog (変数1 変数2 ... 変数n)
   (setq 変数1 初期値1)
   (setq 変数2 初期値2)
   ...
   (setq 変数n 初期値n)
   (while ((not 条件)
           (return (progn 出口 ...)))
     本文1
     ...
     本文n
     (setq 変数1 ステップ1)
     (setq 変数2 ステップ2)
     ...
     (setq 変数n ステップn)))

listから要素を取り除く

始めに引っかかったものだけ。

(defun remove-1 (lis del)
  (cond ((null lis) nil)
        ((eql (car lis) del) (cdr lis))
        (t (cons (car lis) (remove-1 (cdr lis) del)))))

CL-USER> (remove-1 '(a b a b a c a) 'a)
(B A B A C A)
CL-USER> (remove-1 '(a b a b a c a) 'c)
(A B A B A A)

含まれている全てを取り除く。

(defun remove-2 (lis del)
  (cond ((null lis) nil)
        ((eql (car lis) del) (remove-2 (cdr lis) del))
        (t (cons (car lis) (remove-2 (cdr lis) del)))))

CL-USER> (remove-2 '(a b a b a c a) 'a)
(B B C)
CL-USER> (remove-2 '(a b a b a c a) 'c)
(A B A B A A)

condの部分

-検索対象が何もないならnil
-検索対象のcarと削除したいやつが等しかったら,carを取ったやつでremove-2を評価した値を返す。
-どっちでもなかったら,carを取ったやつでremove-2を評価した値にcarをconsしたものを返す。
最終更新:2011年09月09日 17:41