aboutsummaryrefslogtreecommitdiff
path: root/src/interp/union.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp/union.lisp')
-rw-r--r--src/interp/union.lisp157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/interp/union.lisp b/src/interp/union.lisp
new file mode 100644
index 00000000..2c82e06f
--- /dev/null
+++ b/src/interp/union.lisp
@@ -0,0 +1,157 @@
+;; Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+;; All rights reserved.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following conditions are
+;; met:
+;;
+;; - Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;;
+;; - Redistributions in binary form must reproduce the above copyright
+;; notice, this list of conditions and the following disclaimer in
+;; the documentation and/or other materials provided with the
+;; distribution.
+;;
+;; - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+;; names of its contributors may be used to endorse or promote products
+;; derived from this software without specific prior written permission.
+;;
+;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+;; IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+;; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+;; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+;; OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+(IMPORT-MODULE "vmlisp")
+(in-package "VMLISP")
+;;macros from file vmlisp are necessary to compile this file
+
+(DEFUN |intersection| (LIST-OF-ITEMS-1 LIST-OF-ITEMS-2)
+ (PROG (I H V)
+ (SETQ V (SETQ H (CONS NIL NIL)))
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-1))
+ (SETQ LIST-OF-ITEMS-1 (LIST LIST-OF-ITEMS-1)) ) )
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-2))
+ (SETQ LIST-OF-ITEMS-2 (LIST LIST-OF-ITEMS-2)) ) )
+ LP (COND
+ ( (NOT (PAIRP LIST-OF-ITEMS-1))
+ (RETURN (QCDR H)) )
+ ( (|member|
+ (SETQ I (QCAR (RESETQ LIST-OF-ITEMS-1 (QCDR LIST-OF-ITEMS-1))))
+ (QCDR H)) )
+ ( (|member| I LIST-OF-ITEMS-2)
+ (QRPLACD V (SETQ V (CONS I NIL))) ) )
+ (GO LP) ) )
+
+(DEFUN INTERSECTIONQ (LIST-OF-ITEMS-1 LIST-OF-ITEMS-2)
+ (PROG (I H V)
+ (SETQ V (SETQ H (CONS NIL NIL)))
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-1))
+ (SETQ LIST-OF-ITEMS-1 (LIST LIST-OF-ITEMS-1)) ) )
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-2))
+ (SETQ LIST-OF-ITEMS-2 (LIST LIST-OF-ITEMS-2)) ) )
+ LP (COND
+ ( (NOT (PAIRP LIST-OF-ITEMS-1))
+ (RETURN (QCDR H)) )
+ ( (QMEMQ
+ (SETQ I (QCAR (RESETQ LIST-OF-ITEMS-1 (QCDR LIST-OF-ITEMS-1))))
+ (QCDR H)) )
+ ( (QMEMQ I LIST-OF-ITEMS-2)
+ (QRPLACD V (SETQ V (CONS I NIL))) ) )
+ (GO LP) ) )
+
+(DEFUN |union| (LIST-OF-ITEMS-1 LIST-OF-ITEMS-2)
+ (PROG (I H V)
+ (SETQ H (SETQ V (CONS NIL NIL)))
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-1))
+ (SETQ LIST-OF-ITEMS-1 (LIST LIST-OF-ITEMS-1)) ) )
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-2))
+ (SETQ LIST-OF-ITEMS-2 (LIST LIST-OF-ITEMS-2)) ) )
+ LP1 (COND
+ ( (NOT (PAIRP LIST-OF-ITEMS-1))
+ (COND
+ ( (PAIRP LIST-OF-ITEMS-2)
+ (SETQ LIST-OF-ITEMS-1 (RESETQ LIST-OF-ITEMS-2 NIL)) )
+ ( 'T
+ (RETURN (QCDR H)) ) ) )
+ ( (NOT
+ (|member|
+ (SETQ I (QCAR (RESETQ LIST-OF-ITEMS-1 (QCDR LIST-OF-ITEMS-1))))
+ (QCDR H)))
+ (QRPLACD V (SETQ V (CONS I NIL))) ) )
+ (GO LP1) ) )
+
+(DEFUN UNIONQ (LIST-OF-ITEMS-1 LIST-OF-ITEMS-2)
+ (PROG (I H V)
+ (SETQ H (SETQ V (CONS NIL NIL)))
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-1))
+ (SETQ LIST-OF-ITEMS-1 (LIST LIST-OF-ITEMS-1)) ) )
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-2))
+ (SETQ LIST-OF-ITEMS-2 (LIST LIST-OF-ITEMS-2)) ) )
+ LP1 (COND
+ ( (NOT (PAIRP LIST-OF-ITEMS-1))
+ (COND
+ ( (PAIRP LIST-OF-ITEMS-2)
+ (SETQ LIST-OF-ITEMS-1 (RESETQ LIST-OF-ITEMS-2 NIL)) )
+ ( 'T
+ (RETURN (QCDR H)) ) ) )
+ ( (NOT
+ (QMEMQ
+ (SETQ I (QCAR (RESETQ LIST-OF-ITEMS-1 (QCDR LIST-OF-ITEMS-1))))
+ (QCDR H)))
+ (QRPLACD V (SETQ V (CONS I NIL))) ) )
+ (GO LP1) ) )
+
+(DEFUN SETDIFFERENCE (LIST-OF-ITEMS-1 LIST-OF-ITEMS-2)
+ (PROG (I H V)
+ (SETQ H (SETQ V (CONS NIL NIL)))
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-1))
+ (SETQ LIST-OF-ITEMS-1 (LIST LIST-OF-ITEMS-1)) ) )
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-2))
+ (SETQ LIST-OF-ITEMS-2 (LIST LIST-OF-ITEMS-2)) ) )
+ LP1 (COND
+ ( (NOT (PAIRP LIST-OF-ITEMS-1))
+ (RETURN (QCDR H)) )
+ ( (|member|
+ (SETQ I (QCAR (RESETQ LIST-OF-ITEMS-1 (QCDR LIST-OF-ITEMS-1))))
+ (QCDR H)) )
+ ( (NOT (|member| I LIST-OF-ITEMS-2))
+ (QRPLACD V (SETQ V (CONS I NIL))) ) )
+ (GO LP1) ) )
+
+(DEFUN SETDIFFERENCEQ (LIST-OF-ITEMS-1 LIST-OF-ITEMS-2)
+ (PROG (I H V)
+ (SETQ H (SETQ V (CONS NIL NIL)))
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-1))
+ (SETQ LIST-OF-ITEMS-1 (LIST LIST-OF-ITEMS-1)) ) )
+ (COND
+ ( (NOT (LISTP LIST-OF-ITEMS-2))
+ (SETQ LIST-OF-ITEMS-2 (LIST LIST-OF-ITEMS-2)) ) )
+ LP1 (COND
+ ( (NOT (PAIRP LIST-OF-ITEMS-1))
+ (RETURN (QCDR H)) )
+ ( (QMEMQ
+ (SETQ I (QCAR (RESETQ LIST-OF-ITEMS-1 (QCDR LIST-OF-ITEMS-1))))
+ (QCDR H)) )
+ ( (NOT (QMEMQ I LIST-OF-ITEMS-2))
+ (QRPLACD V (SETQ V (CONS I NIL))) ) )
+ (GO LP1) ) )