ToC | DocOverview | CGDoc | RelNotes | Index | PermutedIndex
| Allegro CL

| ANSI Common Lisp 14 Conses 14.2 Dictionary of Conses
14.2.30 ldiff, tailp | Function
  Syntax: ldiff list object result-list tailp object list generalized-boolean Arguments and Values: list - a list, which might be a dotted list. object - an object. result-list - a list. generalized-boolean - a generalized boolean. Description: If object is the same as some tail of list, tailp returns true; otherwise, it returns false. If object is the same as some tail of list, ldiff returns a fresh list of the elements of list that precede object in the list structure of list; otherwise, it returns a copy2 of list. Examples:
       (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
  Side Effects: Neither ldiff nor tailp modifies either of its arguments. Exceptional Situations: Should be prepared to signal an error of type type-error if list is not a proper list or a dotted list. See Also: set-difference Notes: If the list is a circular list, tailp will reliably yield a value only if the given object is in fact a tail of list. Otherwise, the consequences are unspecified: a given implementation which detects the circularity must return false, but since an implementation is not obliged to detect such a situation, tailp might just loop indefinitely without returning in that case. tailp could be defined as follows:
       (defun tailp (object list)
         (do ((list list (cdr list)))
             ((atom list) (eql list object))
            (if (eql object list)
                (return t))))
  and ldiff could be defined by:
      (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)))))
Allegro CL Implementation Details: None.

© Franz Inc. 1998-2019 - File last updated 02-07-2019