Use macro from w3. For details see ChangeLog.
[gnus] / lisp / dgnushack.el
index a20827a..2005ee2 100644 (file)
@@ -1,5 +1,6 @@
 ;;; dgnushack.el --- a hack to set the load path for byte-compiling
-;; Copyright (C) 1994,95,96,97,98,99 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000
+;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Version: 4.19
 
 (require 'cl)
 
+(push (or (getenv "lispdir") 
+         "/usr/share/emacs/site-lisp")
+      load-path)
+(push (or (getenv "W3DIR") (expand-file-name "../../w3/lisp/" srcdir)) 
+      load-path)
+
+(unless (featurep 'xemacs)
+  (define-compiler-macro last (&whole form x &optional n)
+    (if (and (fboundp 'last)
+            (subrp (symbol-function 'last)))
+       form
+      (if n
+         `(let* ((x ,x)
+                 (n ,n)
+                 (m 0)
+                 (p x))
+            (while (consp p)
+              (incf m)
+              (pop p))
+            (if (<= n 0)
+                p
+              (if (< n m)
+                  (nthcdr (- m n) x)
+                x)))
+       `(let ((x ,x))
+          (while (consp (cdr x))
+            (pop x))
+          x))))
+
+  (define-compiler-macro mapcon (&whole form fn seq &rest rest)
+    (if (and (fboundp 'mapcon)
+            (subrp (symbol-function 'mapcon)))
+       form
+      (if rest
+         `(let (res
+                (args (list ,seq ,@rest))
+                p)
+            (while (not (memq nil args))
+              (push (apply ,fn args) res)
+              (setq p args)
+              (while p
+                (setcar p (cdr (pop p)))
+                ))
+            (apply (function nconc) (nreverse res)))
+       `(let (res
+              (arg ,seq))
+          (while arg
+            (push (funcall ,fn arg) res)
+            (setq arg (cdr arg)))
+          (apply (function nconc) (nreverse res))))))
+
+  (define-compiler-macro member-if (&whole form pred list)
+    (if (and (fboundp 'member-if)
+            (subrp (symbol-function 'member-if)))
+       form
+      `(let ((fn ,pred)
+            (seq ,list))
+        (while (and seq
+                    (not (funcall fn (car seq))))
+          (pop seq))
+        seq)))
+
+  (define-compiler-macro union (&whole form list1 list2)
+    (if (and (fboundp 'union)
+            (subrp (symbol-function 'union)))
+       form
+      `(let ((a ,list1)
+            (b ,list2))
+        (cond ((null a) b)
+              ((null b) a)
+              ((equal a b) a)
+              (t
+               (or (>= (length a) (length b))
+                   (setq a (prog1 b (setq b a))))
+               (while b
+                 (or (memq (car b) a)
+                     (push (car b) a))
+                 (pop b))
+               a)))))
+  )
+
 ;; If we are building w3 in a different directory than the source
 ;; directory, we must read *.el from source directory and write *.elc
 ;; into the building directory.  For that, we define this function