Function LDIFF, TAILP

UP


Function LDIFF, TAILP

Function LDIFF, TAILP

構文

ldiff list object => result-list
tailp object list => generalized-boolean

引数と戻り値

list - リスト。ドットリストを受け付けます。
object - オブジェクト
result-list - リスト
generalized-boolean - generalized-boolean

定義

objectlistのどれかの末尾と等しいとき、 tailptrueを返却し、それ以外はfalseを返却します。

objectlistのどれかの末尾と等しいとき、 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

副作用

ldifftailpは、どちらも引数を修正しません。

影響

なし。

例外

listが通常のリストでもドットリストでもないときは、 型type-errorのエラーを発生させる準備をする必要があります。

参考

set-difference

備考

もし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)))))

TOP, Github