(push "/usr/share/emacs/site-lisp" 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