% Function LDIFF, TAILP
Function LDIFF
, TAILP
ldiff
list object => result-list
tailp
object list => generalized-boolean
list - リスト。ドットリストを受け付けます。
object - オブジェクト
result-list - リスト
generalized-boolean - generalized-boolean
objectがlistのどれかの末尾と等しいとき、
tailp
はtrueを返却し、それ以外はfalseを返却します。
objectがlistのどれかの末尾と等しいとき、
ldiff
は、listのリスト構造の中で、
objectより前にある要素を
新しいリストとして返却します。
それ以外のときは、listのコピーを返却します。
(let ((lists '#((a b c) (a b c . d))))
(dotimes (i (length lists)) ()
(let ((list (aref lists i)))
(format t "~2&list=~S ~21T(tailp object list)~
~44T(ldiff list object)~%" list)
(let ((objects (vector list (cddr list) (copy-list (cddr list))
'(f g h) '() 'd 'x)))
(dotimes (j (length objects)) ()
(let ((object (aref objects j)))
(format t "~& object=~S ~21T~S ~44T~S"
object (tailp object list) (ldiff list object))))))))
>>
>> list=(A B C) (tailp object list) (ldiff list object)
>> object=(A B C) T NIL
>> object=(C) T (A B)
>> object=(C) NIL (A B C)
>> object=(F G H) NIL (A B C)
>> object=NIL T (A B C)
>> object=D NIL (A B C)
>> object=X NIL (A B C)
>>
>> list=(A B C . D) (tailp object list) (ldiff list object)
>> object=(A B C . D) T NIL
>> object=(C . D) T (A B)
>> object=(C . D) NIL (A B C . D)
>> object=(F G H) NIL (A B C . D)
>> object=NIL NIL (A B C . D)
>> object=D T (A B C)
>> object=X NIL (A B C . D)
=> NIL
なし。
listが通常のリストでもドットリストでもないときは、
型type-error
のエラーを発生させる準備をする必要があります。
もしlistが循環リストのとき、
objectが実際にlistの末尾である場合にのみ、
tailp
は確実に値を返却します。
その他の結果は未定義であり、
ある実装では循環を検出してfalseを返却しますが、
ある実装ではそのような状況を検出しませんので、
このような場合、tailp
は値を返却することなく、
ただ無限にループするかもしれません。
tailp
は次のように定義できます。
(defun tailp (object list)
(do ((list list (cdr list)))
((atom list) (eql list object))
(if (eql object list)
(return t))))
そしてldiff
は次のようになります。
(defun ldiff (list object)
(do ((list list (cdr list))
(r '() (cons (car list) r)))
((atom list)
(if (eql list object) (nreverse r) (nreconc r list)))
(when (eql object list)
(return (nreverse r)))))