mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	zend_ini_scanner.l by Zend Technologies; New BSD license. common.l by Toshihiro MATSUI, Electrotechnical Laboratory; New BSD license. create_view.l by PostgreSQL Global Development Group; MIT license.
		
			
				
	
	
		
			1202 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			Common Lisp
		
	
	
	
	
	
			
		
		
	
	
			1202 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			Common Lisp
		
	
	
	
	
	
;;; common.l
 | 
						||
;;; commonLisp features for eus
 | 
						||
;;;	
 | 
						||
;;;	Copyright(c)1988, Toshihiro MATSUI, Electrotechnical Laboratory
 | 
						||
;;;	1986-Aug
 | 
						||
;;;	1987-Feb
 | 
						||
;;;	1988-Jun	defclass, setf
 | 
						||
 | 
						||
(in-package "LISP")
 | 
						||
 | 
						||
(list "@(#)$Id: common.l,v 1.1.1.1 2003/11/20 07:46:30 eus Exp $")
 | 
						||
 | 
						||
(export '(lisp-implementation-type lisp-implementation-version))
 | 
						||
 | 
						||
(export '(macroexpand prog1 loop unless until
 | 
						||
	  pop push pushnew inc dec incf decf))
 | 
						||
 | 
						||
(export '(defvar defparameter defconstant deflocal
 | 
						||
	dotimes dolist
 | 
						||
	do-symbols do-external-symbols do-all-symbols
 | 
						||
	psetq do do* prog prog*
 | 
						||
	case classcase otherwise
 | 
						||
	string alias
 | 
						||
	caaar caadr cadar cdaar cdadr cddar cdddr
 | 
						||
	fourth fifth sixth seventh eighth 
 | 
						||
	cadddr cddddr cadddr caaddr cdaddr caddddr
 | 
						||
	flatten list-insert list-delete adjoin union intersection
 | 
						||
	set-difference set-exclusive-or rotate-list last copy-tree
 | 
						||
	copy-list nreconc rassoc acons member assoc subsetp maplist mapcon))
 | 
						||
 | 
						||
(export '(find find-if find-if-not position position-if position-if-not
 | 
						||
	count count-if count-if-not member-if member-if-not 
 | 
						||
	pairlis make-list make-sequence fill replace
 | 
						||
	transpose-list
 | 
						||
	remove remove-if remove-if-not delete delete-if delete-if-not
 | 
						||
	substitute substitute-if substitute-if-not 
 | 
						||
	nsubstitute nsubstitute-if nsubstitute-if-not
 | 
						||
	unique remove-duplicates extream
 | 
						||
	send-super-lexpr send-lexpr send-super send-all resend
 | 
						||
	send-super* send*
 | 
						||
	instance instance* 
 | 
						||
	make-instance defclassmethod delete-method
 | 
						||
	make-class defstruct defclass readtablep copy-readtable
 | 
						||
	set-syntax-from-char
 | 
						||
	collect-if collect-instances
 | 
						||
))
 | 
						||
 | 
						||
(export '(keywordp constantp functionp vector-class-p
 | 
						||
	compiled-function-p input-stream-p output-stream-p io-stream-p
 | 
						||
	special-form-p macro-function))
 | 
						||
 | 
						||
(export '(zerop plusp minusp oddp evenp /= logandc1 logandc2
 | 
						||
	ecase every some reduce merge-list merge expt signum
 | 
						||
	defsetf define-setf-method 
 | 
						||
	setf multiple-value-bind multiple-value-setq pop push))
 | 
						||
(export '(get-internal-run-time  list-length values
 | 
						||
	 first second third bye))
 | 
						||
 | 
						||
(export '(rad2deg deg2rad ))
 | 
						||
 | 
						||
;; version
 | 
						||
(defun lisp-implementation-type () "EusLisp")
 | 
						||
(defun lisp-implementation-version ()
 | 
						||
	(format nil
 | 
						||
	        "EusLisp ~A~A for ~A created on ~A(~A)"
 | 
						||
		(car lisp-implementation-version)
 | 
						||
		(cdddr lisp-implementation-version)
 | 
						||
		*OS-VERSION*
 | 
						||
		(cadr lisp-implementation-version)
 | 
						||
                (caddr lisp-implementation-version)
 | 
						||
                ))
 | 
						||
(setq euserror nil)
 | 
						||
;;;
 | 
						||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
						||
;; basic macros
 | 
						||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
						||
 | 
						||
(eval-when (load eval)
 | 
						||
 | 
						||
(defun macroexpand (form)
 | 
						||
  (let ((r (macroexpand2 form)))
 | 
						||
    (while (and (listp r) (macro-function (car r)))
 | 
						||
	(setq r (macroexpand2 r)))
 | 
						||
    r))
 | 
						||
 | 
						||
;(defmacro defun (fname &rest fdef)
 | 
						||
;   `(progn
 | 
						||
;	(setq (',fname . function) (cons 'lambda ',fdef))
 | 
						||
;        (remprop ',fname 'builtin-function-entry)
 | 
						||
;	',fname))
 | 
						||
 | 
						||
(defmacro prog1 (&rest args)
 | 
						||
   (let ((first (gensym "PROG1")))
 | 
						||
      `(let ((,first ,(car args)))
 | 
						||
	  (progn . ,(cdr args)) ,first)))
 | 
						||
 | 
						||
(defmacro loop (&rest forms) 
 | 
						||
   (let ((tag (gensym "LOOP")))
 | 
						||
       `(block nil (tagbody ,tag ,@forms (go ,tag)))))
 | 
						||
(defmacro unless (pred &rest form)
 | 
						||
  `(when (not ,pred) . ,form))
 | 
						||
(defmacro until (condition &rest forms)
 | 
						||
   `(while (not ,condition) ,@forms))
 | 
						||
(defmacro pop (s) `(prog1 (car ,s) (setf ,s (cdr ,s))))
 | 
						||
(defmacro push (item place) `(setf ,place (cons ,item ,place)))
 | 
						||
(defmacro pushnew (item place &key test test-not key)
 | 
						||
   `(progn (if (not (member ,item ,place :test ,test :test-not ,test-not
 | 
						||
					 :key ,key))
 | 
						||
		(setf ,place (cons ,item ,place)))
 | 
						||
	   nil))
 | 
						||
(defmacro inc (var &optional h)
 | 
						||
   (if h (setq h (list '+ var h)) (setq h (list '1+ var)))
 | 
						||
   (list 'setq var h))
 | 
						||
(defmacro dec (var &optional h)
 | 
						||
   (if h (setq h (list '- var h)) (setq h (list '1- var)))
 | 
						||
   (list 'setq var h))
 | 
						||
(defmacro incf (var &optional h)
 | 
						||
   (if h (setq h (list '+ var h)) (setq h (list '1+ var)))
 | 
						||
   (list 'setf var h))
 | 
						||
(defmacro decf (var &optional h)
 | 
						||
   (if h (setq h (list '- var h)) (setq h (list '1- var)))
 | 
						||
   (list 'setf var h))
 | 
						||
 | 
						||
(defmacro defvar (var &optional (init nil) (doc nil))
 | 
						||
   (unless (symbolp var) (error 20))
 | 
						||
  `(when (eql (send ',var :vtype) 1) 
 | 
						||
	(send ',var :vtype 2)
 | 
						||
        (if (not (boundp ',var))
 | 
						||
	    (send ',var :global ,init ,doc ))
 | 
						||
	',var))
 | 
						||
 | 
						||
(defmacro deflocal (var &optional (init nil) (doc nil))
 | 
						||
   (unless (symbolp var) (error 20))
 | 
						||
   `(progn
 | 
						||
	(send ',var :special ,init ,doc)
 | 
						||
	',var))
 | 
						||
 | 
						||
(defmacro defparameter (var init &optional (doc nil))
 | 
						||
   (unless (symbolp var) (error 20))
 | 
						||
   `(send ',var :global ,init ,doc))
 | 
						||
 | 
						||
(defmacro defconstant (sym val &optional doc)
 | 
						||
   (unless (symbolp sym) (error 20))
 | 
						||
   `(send ',sym :constant ,val ,doc) )
 | 
						||
  
 | 
						||
 | 
						||
(defmacro dotimes (vars &rest forms)
 | 
						||
  (let ((endvar (gensym "DOTIMES")))
 | 
						||
     `(let ((,(car vars) 0) (,endvar ,(cadr vars)))
 | 
						||
	(declare (integer ,(car vars) ,endvar))
 | 
						||
	(while (< ,(car vars) ,endvar)
 | 
						||
	       ,@forms
 | 
						||
	       (setq ,(car vars) (1+ ,(car vars))))
 | 
						||
	,(caddr vars)))) 
 | 
						||
 | 
						||
(defmacro dolist (vars &rest forms)
 | 
						||
   (let ((lists (gensym "DOLIST")) (decl (car forms)))
 | 
						||
     (if (and (consp decl) (eq (car decl) 'declare))
 | 
						||
	 (setq forms (cdr forms))
 | 
						||
	 (setq decl nil))
 | 
						||
     `(let ((,(car vars) nil) (,lists ,(cadr vars)))
 | 
						||
	,decl
 | 
						||
	(while ,lists
 | 
						||
	   (setq ,(car vars) (pop ,lists))
 | 
						||
	   ,@forms)
 | 
						||
	,(caddr vars)))) 
 | 
						||
 | 
						||
(defmacro do-symbols (vars &rest forms)
 | 
						||
   (let* ((symbols (gensym "DOSYM"))
 | 
						||
	  (v (car vars))
 | 
						||
	  (pkg (if (cadr vars) (cadr vars) '*package*))
 | 
						||
	  (pkgv (gensym))
 | 
						||
	  (i (gensym))
 | 
						||
	  (size (gensym))
 | 
						||
	  (svec (gensym))
 | 
						||
	  )
 | 
						||
   `(let* ((,v nil)
 | 
						||
	   (,pkgv (find-package ,pkg))
 | 
						||
	   (,i 0)
 | 
						||
	   (,svec (,pkgv . intsymvector))
 | 
						||
	   (,size (length ,svec)))
 | 
						||
	(while (< ,i ,size)
 | 
						||
	   (setq ,v (elt ,svec ,i))
 | 
						||
	   (inc ,i)
 | 
						||
	   (when (symbolp ,v) . ,forms))
 | 
						||
	,(caddr vars))))
 | 
						||
 | 
						||
(defmacro do-external-symbols (vars &rest forms)
 | 
						||
   (let* ((symbols (gensym "DOEXTSYM"))
 | 
						||
	  (v (car vars))
 | 
						||
	  (pkg (if (cadr vars) (cadr vars) '*package*))
 | 
						||
	  (pkgv (gensym))
 | 
						||
	  (i (gensym))
 | 
						||
	  (size (gensym))
 | 
						||
	  (svec (gensym))
 | 
						||
	  )
 | 
						||
   `(let* ((,v nil)
 | 
						||
	   (,pkgv (find-package ,pkg))
 | 
						||
	   (,i 0)
 | 
						||
	   (,svec (,pkgv . symvector))
 | 
						||
	   (,size (length ,svec)))
 | 
						||
	(while (< ,i ,size)
 | 
						||
	   (setq ,v (elt ,svec ,i))
 | 
						||
	   (inc ,i)
 | 
						||
	   (when (symbolp ,v) . ,forms))
 | 
						||
	,(caddr vars))))
 | 
						||
 | 
						||
(defmacro do-all-symbols (var &rest forms)
 | 
						||
   (let ((apackage (gensym "DOALLSYM")))
 | 
						||
      `(dolist (,apackage (list-all-packages) ,(cadr var))
 | 
						||
	   (do-symbols (,(car var) ,apackage)  . ,forms) )
 | 
						||
       ))
 | 
						||
 | 
						||
(defmacro psetq (&rest varvals)
 | 
						||
   (let* (vars vals gvars)
 | 
						||
      (while varvals
 | 
						||
	(push (pop varvals) vars)
 | 
						||
	(push (pop varvals) vals)
 | 
						||
	(push (gensym "PSETQ") gvars))
 | 
						||
     (setq vars (nreverse vars) vals (nreverse vals) gvars (nreverse gvars))
 | 
						||
     `(let* ,(mapcar #'list gvars vals)
 | 
						||
	(setq . ,(mapcan #'list vars gvars))
 | 
						||
	nil)))
 | 
						||
 | 
						||
(defmacro do (vars endtest &rest body)
 | 
						||
  (let ((decl (car body)) (tag (gensym "DO")))
 | 
						||
   (if  (and (consp decl) (eq (car decl) 'declare))
 | 
						||
	(setq body (cdr body))
 | 
						||
	(setq decl nil))
 | 
						||
   `(block nil
 | 
						||
     (let
 | 
						||
      ,(mapcar
 | 
						||
	  #'(lambda (v) (list (car v) (cadr v)))
 | 
						||
	  vars)
 | 
						||
      ,decl
 | 
						||
      (tagbody
 | 
						||
	 ,tag
 | 
						||
	 (if ,(car endtest) (return (progn . ,(cdr endtest))))
 | 
						||
	 ,@body
 | 
						||
	 (psetq . ,(mapcan #'(lambda (v) (if (cddr v) (list (car v) (caddr v))))
 | 
						||
		       vars))
 | 
						||
	 (go ,tag))) )))
 | 
						||
 | 
						||
(defmacro do* (vars endtest &rest body)
 | 
						||
  (let ((decl (car body)) (tag (gensym "DO*")))
 | 
						||
   (if  (and (consp decl) (eq (car decl) 'declare))
 | 
						||
	(setq body (cdr body))
 | 
						||
	(setq decl nil))
 | 
						||
   `(block nil
 | 
						||
     (let*
 | 
						||
      ,(mapcar
 | 
						||
	  #'(lambda (v) (list (car v) (cadr v)))
 | 
						||
	  vars)
 | 
						||
      ,decl
 | 
						||
      (tagbody
 | 
						||
	 ,tag
 | 
						||
	 (if ,(car endtest) (return (progn . ,(cdr endtest))))
 | 
						||
	 ,@body
 | 
						||
	 (setq . ,(mapcan #'(lambda (v) (if (cddr v) (list (car v) (caddr v))))
 | 
						||
		       vars))
 | 
						||
	(go ,tag))) )))
 | 
						||
 | 
						||
 | 
						||
(defmacro prog (vars &rest body)
 | 
						||
  `(block nil
 | 
						||
      (let ,vars 
 | 
						||
	 (tagbody ,@body))))
 | 
						||
(defmacro prog* (vars &rest body)
 | 
						||
  `(block nil
 | 
						||
      (let* ,vars 
 | 
						||
	 (tagbody ,@body))))
 | 
						||
 | 
						||
)
 | 
						||
;;
 | 
						||
;;	case
 | 
						||
;;
 | 
						||
(eval-when (load eval)
 | 
						||
(defun casebody (body) (if (cdr body) (cons 'progn body) (car body)))
 | 
						||
 | 
						||
(defun casehead (keyvar head)
 | 
						||
   (if (atom head)
 | 
						||
	(if (memq head '(t otherwise))
 | 
						||
	    t
 | 
						||
	    (list 'eq keyvar (list 'quote head)))
 | 
						||
       (list 'memq keyvar (list 'quote head)) ))
 | 
						||
 | 
						||
(defun case1 (keyvar clauses)
 | 
						||
  (if (atom clauses)
 | 
						||
      nil
 | 
						||
      (list 'if
 | 
						||
	    (casehead keyvar (caar clauses))
 | 
						||
            (casebody (cdar clauses))
 | 
						||
	    (case1 keyvar (cdr clauses)) nil)))
 | 
						||
 | 
						||
(defmacro case (key &rest clauses)
 | 
						||
  (let ((keyvar (gensym "CASE")) (result nil))
 | 
						||
     (list 'let (list (list keyvar key)) (case1 keyvar clauses))
 | 
						||
  ))
 | 
						||
 | 
						||
(defun classcasehead (keyvar head)
 | 
						||
  (if (memq head '(t otherwise))
 | 
						||
      t
 | 
						||
      (if (atom head)
 | 
						||
          `(derivedp ,keyvar ,head)
 | 
						||
          `(or . ,(mapcar #'(lambda (x) `(derivedp ,keyvar ,x)) head)))))
 | 
						||
 | 
						||
(defun classcase1 (keyvar clauses)
 | 
						||
  (if (atom clauses)
 | 
						||
      nil
 | 
						||
      (list 'if
 | 
						||
	    (classcasehead keyvar (caar clauses))
 | 
						||
            (casebody (cdar clauses))
 | 
						||
	    (classcase1 keyvar (cdr clauses)) nil)))
 | 
						||
 | 
						||
(defmacro classcase (key &rest clauses)
 | 
						||
   (let ((kv (gensym "CCASE")))
 | 
						||
      `(let ((,kv ,key)) ,(classcase1 kv clauses))))
 | 
						||
)
 | 
						||
 | 
						||
;; string
 | 
						||
 | 
						||
(defun string (x)
 | 
						||
  (if (stringp x) x
 | 
						||
      (if (symbolp x) (copy-seq (x . pname))
 | 
						||
	  (if (numberp x) (format nil "~d" x)
 | 
						||
	      (error x)))))
 | 
						||
 | 
						||
;
 | 
						||
; more list functions
 | 
						||
;
 | 
						||
(eval-when (load eval)
 | 
						||
   (defun alias (new old) (setslot new symbol 'function
 | 
						||
				   (symbol-function old)))
 | 
						||
   (alias 'list-length 'length)
 | 
						||
   (alias 'values 'list)
 | 
						||
   )
 | 
						||
 | 
						||
(eval-when (load eval)
 | 
						||
(defun caaar (x) (car (caar x)))
 | 
						||
(defun caadr (x) (car (cadr x)))
 | 
						||
(defun cadar (x) (car (cdar x)))
 | 
						||
(defun cdaar (x) (cdr (caar x)))
 | 
						||
(defun cdadr (x) (cdr (cadr x)))
 | 
						||
(defun cddar (x) (cdr (cdar x)))
 | 
						||
(defun cdddr (x) (cdr (cddr x)))
 | 
						||
(alias 'first 'car)
 | 
						||
(alias 'second 'cadr)
 | 
						||
(alias 'third 'caddr)
 | 
						||
(defun fourth (x) (cadr (cddr x)))
 | 
						||
(defun fifth  (x) (caddr (cddr x)))
 | 
						||
(defun sixth  (x) (caddr (cdddr x)))
 | 
						||
(defun seventh  (x) (caddr (cddddr x)))
 | 
						||
(defun eighth  (x) (cadddr (cddddr x)))
 | 
						||
#|
 | 
						||
(defun cadddr (x) (car (cdddr x)))
 | 
						||
|#
 | 
						||
(defun cddddr (x) (cddr (cddr x)))
 | 
						||
(defun cadddr (x) (cadr (cddr x)))
 | 
						||
(defun caaddr (x) (caar (cddr x)))
 | 
						||
(defun cdaddr (x) (cdar (cddr x)))
 | 
						||
(defun caddddr (x) (cadr (cdddr x)))
 | 
						||
(defun flatten (l &optional accumulator)
 | 
						||
  (cond
 | 
						||
   ((null l) accumulator)
 | 
						||
   ((atom l) (cons l accumulator))
 | 
						||
   (t (flatten (car l)
 | 
						||
	       (flatten (cdr l) accumulator)))) )
 | 
						||
 | 
						||
(defun list-insert (item pos list)
 | 
						||
   "insert item as the pos'th element in list.
 | 
						||
if pos is bigger than the length of list, item is nconc'ed at the tail"
 | 
						||
   (cond ((null list) (list item))
 | 
						||
	 ((>= pos (length list)) (nconc list (list item)))
 | 
						||
	 ((= pos 0) (cons item list))
 | 
						||
	 (t (let ((tail (cons item (nthcdr pos list))))
 | 
						||
		(rplacd (nthcdr  (1- pos) list) tail)
 | 
						||
		list))))
 | 
						||
 | 
						||
(defun list-delete (lst n)	"(lst n) delete nth element of lst"
 | 
						||
   (if (= n 0) 
 | 
						||
	(setq lst (cdr lst))
 | 
						||
	(rplacd (nthcdr (1- n) lst) (nthcdr (1+ n) lst))  )
 | 
						||
   lst)
 | 
						||
 | 
						||
(defun adjoin (item list &key (test #'eq) (test-not) (key #'identity))
 | 
						||
  (if (member item list :test test :test-not test-not :key key)
 | 
						||
      list
 | 
						||
      (cons item list)))
 | 
						||
 | 
						||
(defun union (list1 list2 &key (test #'eq) (test-not) (key #'identity))
 | 
						||
  (let (result)
 | 
						||
    (dolist (item list1)
 | 
						||
      (unless (member (funcall key item) result
 | 
						||
		      :test test :test-not test-not :key key)
 | 
						||
	  (setq result (cons item result))))
 | 
						||
    (dolist (item list2)
 | 
						||
      (unless (member  (funcall key item) result 
 | 
						||
		       :test test :test-not test-not :key key)
 | 
						||
	  (setq result (cons item result))))
 | 
						||
    (reverse result)))
 | 
						||
 | 
						||
(defun intersection (list1 list2 &key (test #'eq) (test-not) (key #'identity))
 | 
						||
   (let (r)
 | 
						||
      (dolist (item list1)
 | 
						||
	(if (member (funcall key item) list2
 | 
						||
		    :test test :test-not test-not :key key)
 | 
						||
	    (setq r (cons item r))))
 | 
						||
      r))
 | 
						||
 | 
						||
(defun set-difference (list1 list2 &key (test #'eq) (test-not)
 | 
						||
					(key #'identity))
 | 
						||
   (let (result)
 | 
						||
     (dolist (l1 list1)
 | 
						||
	(unless (member (funcall key l1) list2
 | 
						||
			:test test :test-not test-not :key key)
 | 
						||
	   (push l1 result)))
 | 
						||
     (nreverse result)))
 | 
						||
 | 
						||
(defun set-exclusive-or (list1 list2 &key (test #'eq) (test-not)
 | 
						||
					  (key #'identity))
 | 
						||
   (let (result1 result2)
 | 
						||
     (dolist (l1 list1)
 | 
						||
	(setq l1 (funcall key l1))
 | 
						||
	(unless (member l1 list2 :test test :test-not test-not :key key)
 | 
						||
	   (push l1 result1)))
 | 
						||
     (dolist (l2 list2)
 | 
						||
	(setq l2 (funcall key l2))
 | 
						||
	(unless (member l2 list1 :test test :test-not test-not :key key)
 | 
						||
	   (push l2 result2)))
 | 
						||
     (nconc result1 result2)))
 | 
						||
 | 
						||
(defun rotate-list (l) (append (cdr l) (list (car l))))
 | 
						||
(defun last (x)
 | 
						||
  (while (consp (cdr x)) (setq x (cdr x)))
 | 
						||
  x)
 | 
						||
(defun copy-tree (x) (subst t t x))
 | 
						||
(defun copy-list (x) (nreverse (reverse x)))
 | 
						||
(defun nreconc (x y) (nconc (nreverse x) y))
 | 
						||
(defun rassoc (item alist)
 | 
						||
  (dolist (a alist)
 | 
						||
     (if (equal item (cdr a)) (return-from rassoc a))))
 | 
						||
(defun acons (key datum alist) (cons (cons key datum) alist))
 | 
						||
(defun member (item list &key key test test-not)
 | 
						||
   (supermember item list key test test-not))
 | 
						||
(defun assoc (item alist &key key test test-not)
 | 
						||
   (superassoc item alist key test test-not))
 | 
						||
(defun subsetp (sub super &key key test test-not)
 | 
						||
   (every #'(lambda (s) (member s super :key key :test test :test-not test-not))
 | 
						||
	  sub))
 | 
						||
(defun maplist (func arg &rest more-args &aux result)
 | 
						||
   (if more-args
 | 
						||
       (let (arglist margs)
 | 
						||
	  (while arg
 | 
						||
	     (setq arglist nil)
 | 
						||
	     (push arg arglist)
 | 
						||
	     (setq arg (cdr arg))
 | 
						||
	     (setq margs more-args)
 | 
						||
	     (while margs
 | 
						||
		(push (car margs) arglist)
 | 
						||
		(setf (car margs) (cdar margs))
 | 
						||
		(setq margs (cdr margs)) )
 | 
						||
	     (push (apply func (nreverse arglist)) result) ))
 | 
						||
        (while arg
 | 
						||
	    (push (funcall func arg) result)
 | 
						||
	    (setq arg (cdr arg)))) 
 | 
						||
   (nreverse result))
 | 
						||
 | 
						||
(defun mapcon (func arg &rest more-args &aux result)
 | 
						||
   (if more-args
 | 
						||
       (let (arglist margs)
 | 
						||
	  (while arg
 | 
						||
	     (setq arglist nil)
 | 
						||
	     (push arg arglist)
 | 
						||
	     (setq arg (cdr arg))
 | 
						||
	     (setq margs more-args)
 | 
						||
	     (while margs
 | 
						||
		(push (car margs) arglist)
 | 
						||
		(setf (car margs) (cdar margs))
 | 
						||
		(setq margs (cdr margs)) )
 | 
						||
	     (setq result (nconc (apply func (nreverse arglist)) result) )) )
 | 
						||
        (while arg
 | 
						||
	    (setq result (nconc (funcall func arg) result))
 | 
						||
	    (setq arg (cdr arg)))) 
 | 
						||
   (nreverse result))
 | 
						||
 | 
						||
(defun find (item seq &key (start 0) (end (length seq))
 | 
						||
		           (test #'eq) (test-not nil) (key #'identity))
 | 
						||
   (system::raw-find item seq test test-not key nil nil start end))
 | 
						||
(defun find-if (pred seq &key (start 0) (end (length seq)) (key #'identity))
 | 
						||
   (system::raw-find nil seq nil nil key pred nil start end))
 | 
						||
(defun find-if-not (pred seq &key (start 0) (end (length seq)) (key #'identity))
 | 
						||
   (system::raw-find nil seq nil nil key nil pred start end))
 | 
						||
 | 
						||
(defun position (item seq &key (start 0) (end (length seq)) (count 1)
 | 
						||
		           (test #'eq) (test-not nil) (key #'identity))
 | 
						||
   (system::raw-position item seq test test-not key nil nil start end count))
 | 
						||
(defun position-if (pred seq &key (start 0) (end (length seq)) (count 1) (key #'identity))
 | 
						||
   (system::raw-position nil seq nil nil key pred nil start end count))
 | 
						||
(defun position-if-not (pred seq &key (start 0) (end (length seq)) (count 1) (key #'identity))
 | 
						||
   (system::raw-position nil seq nil nil key nil pred start end count))
 | 
						||
 | 
						||
(defun count (item seq &key (start 0) (end (length seq))
 | 
						||
		           (test #'eq) (test-not nil) (key #'identity))
 | 
						||
   (system::raw-count item seq test test-not key nil nil start end))
 | 
						||
(defun count-if (pred seq &key (start 0) (end (length seq)) (key #'identity))
 | 
						||
   (system::raw-count nil seq nil nil key pred nil start end))
 | 
						||
(defun count-if-not (pred seq &key (start 0) (end (length seq)) (key #'identity))
 | 
						||
   (system::raw-count nil seq nil nil key nil pred start end))
 | 
						||
(defun member-if (test list &key (key #'identity))
 | 
						||
   (while list
 | 
						||
      (if (funcall test (funcall key (car list))) 
 | 
						||
	  (return-from member-if list)
 | 
						||
	  (setq list (cdr list)))))
 | 
						||
(defun member-if-not (test list &key (key #'identity))
 | 
						||
   (while list
 | 
						||
      (if (not (funcall test (funcall key (car list))) )
 | 
						||
	  (return-from member-if-not list)
 | 
						||
	  (setq list (cdr list)))))
 | 
						||
(defun collect-if (func seq &aux r)
 | 
						||
   (dolist (s seq)
 | 
						||
      (if (funcall func s) (push s r)) )
 | 
						||
   (nreverse r) )
 | 
						||
(defun collect-instances (klass list)
 | 
						||
   (collect-if #'(lambda (i) (derivedp i klass)) (flatten list)))
 | 
						||
 | 
						||
(defun pairlis (l1 l2 &optional alist)
 | 
						||
   (if l1
 | 
						||
       (cons (cons (car l1) (car l2)) (pairlis (cdr l1) (cdr l2) alist))
 | 
						||
       alist))
 | 
						||
 | 
						||
(defun transpose-list (dlist)
 | 
						||
   (let (r)
 | 
						||
      (dotimes (i (length (car dlist)))
 | 
						||
	 (push (mapcar #'(lambda (x) (nth i x)) dlist) r))
 | 
						||
      (nreverse r)))
 | 
						||
 | 
						||
(defun make-list (leng &key initial-element)
 | 
						||
  (let (r)
 | 
						||
   (unless (integerp leng) (error "integer required for length of make-list"))
 | 
						||
   (dotimes (i leng r)
 | 
						||
	(push initial-element r))))
 | 
						||
 | 
						||
(defun make-sequence (type size &key initial-element)
 | 
						||
  (if (or (memq type '(cons list)) (eq type cons))
 | 
						||
      (make-list size :initial-element initial-element)
 | 
						||
      (make-array size :element-type type :initial-element initial-element)))
 | 
						||
 | 
						||
(defun fill (seq item &key (start 0) (end (length seq)))
 | 
						||
   (system::raw-fill seq item start end))
 | 
						||
 | 
						||
(defun replace (dest src &key (start1 0) (end1 (length dest))
 | 
						||
			      (start2 0) (end2 (length src)))
 | 
						||
  (let ((result dest) (count (min (- end1 start1) (- end2 start2))))
 | 
						||
   (cond ((listp dest)
 | 
						||
	  (setq dest (nthcdr start1 dest))
 | 
						||
	  (cond ((listp src)
 | 
						||
		 (setq src (nthcdr start2 src))
 | 
						||
		 (dotimes (c count)
 | 
						||
		    (setq (dest . car) (pop src))
 | 
						||
		    (pop dest)))
 | 
						||
		(t
 | 
						||
		  (dotimes (c count)
 | 
						||
		    (setq (dest . car) (aref src start2))
 | 
						||
		    (inc start2) (pop dest)))))
 | 
						||
	((listp src)	; list --> vector
 | 
						||
	 (setq src (nthcdr start2 src))
 | 
						||
	 (dotimes (c count)
 | 
						||
	    (aset dest start1 (pop src))
 | 
						||
	    (inc start1)))
 | 
						||
	(t (system::vector-replace dest src start1 end1 start2 end2)))
 | 
						||
    result))
 | 
						||
 | 
						||
(defun remove (item seq &key (start 0) (end (length seq))
 | 
						||
			      (test #'eq) (test-not nil)
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::universal-remove item seq test test-not key nil nil start end count))
 | 
						||
(defun remove-if (pred seq &key (start 0) (end (length seq))
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::universal-remove nil seq nil nil key pred nil start end count))
 | 
						||
(defun remove-if-not (pred seq &key (start 0) (end (length seq))
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::universal-remove nil seq nil nil key nil pred start end count))
 | 
						||
 | 
						||
(defun delete (item seq &key (start 0) (end (length seq))
 | 
						||
			      (test #'eq) (test-not nil)
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::raw-delete item seq test test-not key nil nil start end count))
 | 
						||
(defun delete-if (pred seq &key (start 0) (end (length seq))
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::raw-delete nil seq nil nil key pred nil start end count))
 | 
						||
(defun delete-if-not (pred seq &key (start 0) (end (length seq))
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::raw-delete nil seq nil nil key nil pred start end count))
 | 
						||
 | 
						||
(defun substitute (newitem olditem seq &key (start 0) (end (length seq))
 | 
						||
			      (test #'eq) (test-not nil)
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::raw-substitute newitem olditem seq test test-not key nil nil start end count))
 | 
						||
(defun substitute-if (newitem pred seq &key (start 0) (end (length seq))
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::raw-substitute newitem nil seq nil nil key pred nil start end count))
 | 
						||
(defun substitute-if-not (newitem pred seq &key (start 0) (end (length seq))
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::raw-substitute newitem nil seq nil nil key nil pred start end count))
 | 
						||
 | 
						||
(defun nsubstitute (newitem olditem seq &key (start 0) (end (length seq))
 | 
						||
			      (test #'eq) (test-not nil)
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::raw-nsubstitute newitem olditem seq test test-not key nil nil start end count))
 | 
						||
(defun nsubstitute-if (newitem pred seq &key (start 0) (end (length seq))
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::raw-nsubstitute newitem nil seq nil nil key pred nil start end count))
 | 
						||
(defun nsubstitute-if-not (newitem pred seq &key (start 0) (end (length seq))
 | 
						||
			      (count 1000000) (key #'identity))
 | 
						||
    (system::raw-nsubstitute newitem nil seq nil nil key nil pred start end count))
 | 
						||
 | 
						||
(defun unique (l)
 | 
						||
   (cond
 | 
						||
      ((atom (cdr l)) l)
 | 
						||
      ((memq (car l) (cdr l)) (unique (cdr l)))
 | 
						||
      (t (cons (car l) (unique (cdr l))))))
 | 
						||
 | 
						||
(defun remove-duplicates (seq &key (test #'eq) (test-not) (key #'identity)
 | 
						||
				   (start 0) (end 1000000))
 | 
						||
   (system::raw-remove-duplicates seq test test-not key start end))
 | 
						||
 | 
						||
(defun extream (seq test &optional (key #'identity))
 | 
						||
   (if (null seq)
 | 
						||
       nil
 | 
						||
       (let* ((ext (elt seq 0))  (p (funcall key ext)) x)
 | 
						||
	  (if (consp seq)
 | 
						||
	      (dolist (v (cdr seq))
 | 
						||
		   (when (funcall test (funcall key v) p)
 | 
						||
		      (setq ext v
 | 
						||
			    p   (funcall key ext))) ) 
 | 
						||
	      (dotimes (i (length seq))
 | 
						||
		   (when (funcall test
 | 
						||
				  (funcall key (setq x (aref seq i)))
 | 
						||
				  p)
 | 
						||
		      (setq ext x
 | 
						||
			    p   (funcall key ext)))) )
 | 
						||
          ext)) )
 | 
						||
) ;eval-when
 | 
						||
 | 
						||
 | 
						||
;;;
 | 
						||
;;; equivalent pairs from WINSTON
 | 
						||
;;;
 | 
						||
 | 
						||
#|
 | 
						||
(eval-when (load eval)
 | 
						||
(defun coalesce (pairs) (coalesce-aux pairs nil))
 | 
						||
(defun coalesce-aux (pairs classes)
 | 
						||
  (cond ((null pairs) classes)
 | 
						||
	(t (coalesce-aux (cdr pairs)
 | 
						||
			 (absorb (car pairs) classes)))))
 | 
						||
(defun stick-in (new classes)
 | 
						||
  (cond ((member new (car classes)) classes)
 | 
						||
	(t (cons (cons new (car classes))
 | 
						||
		 (cdr classes)))))
 | 
						||
(defun absorb (pair classes)
 | 
						||
  (cond ((null classes) (list pair))
 | 
						||
	((member (car pair) (car classes))
 | 
						||
	 (stick-in (cadr pair) classes))
 | 
						||
	((member (cadr pair) (car classes))
 | 
						||
	 (stick-in (car pair) classes))
 | 
						||
	(t (cons (car classes)
 | 
						||
		 (absorb pair (cdr classes))))))
 | 
						||
) ;eval-when ; end of more list functions
 | 
						||
|#
 | 
						||
 | 
						||
 | 
						||
;;;
 | 
						||
;;; LEO functions
 | 
						||
;;;
 | 
						||
(eval-when (load eval)
 | 
						||
(defmacro send-super-lexpr (selector &rest msgs)
 | 
						||
  (declare (type metaclass class))
 | 
						||
  `(apply #'send-message self (class . super) ,selector . ,msgs)
 | 
						||
  )
 | 
						||
(defmacro send-super* (&rest msgs)
 | 
						||
  (declare (type metaclass class))
 | 
						||
  `(apply #'send-message self (class . super) . ,msgs)
 | 
						||
  )
 | 
						||
(defmacro send-lexpr (target selector &rest msgs)
 | 
						||
  `(apply #'send ,target ,selector . ,msgs)
 | 
						||
  )
 | 
						||
(defmacro send* (&rest msgs)
 | 
						||
  `(apply #'send . ,msgs)
 | 
						||
  )
 | 
						||
(defmacro send-super (selector &rest msgs)
 | 
						||
  (declare (type metaclass class))
 | 
						||
  `(send-message self (class . super) ,selector ,@msgs))
 | 
						||
 | 
						||
(defun send-all (receivers &rest mesg)
 | 
						||
  (mapcar #'(lambda (r) (apply 'send r mesg)) receivers))
 | 
						||
 | 
						||
(defun resend (obj mesg)
 | 
						||
   (eval (cons 'send (cons obj mesg))))
 | 
						||
 | 
						||
(defmacro instance (cls &rest message)
 | 
						||
  (if message
 | 
						||
	(let ((v (gensym "INST")))
 | 
						||
	`(let ((,v (instantiate ,cls))) (send ,v ,@message) ,v))
 | 
						||
	`(instantiate ,cls)))
 | 
						||
 | 
						||
(defmacro instance* (cls &rest message)
 | 
						||
  (if message
 | 
						||
	(let ((v (gensym "INST")))
 | 
						||
	`(let ((,v (instantiate ,cls))) (send* ,v ,@message) ,v))
 | 
						||
	`(instantiate ,cls)))
 | 
						||
 | 
						||
(defun make-instance (klass &rest args)
 | 
						||
   (let ((inst (instantiate klass)))
 | 
						||
      (while args
 | 
						||
	 (setslot inst klass (string (pop args)) (pop args)))
 | 
						||
      inst))
 | 
						||
 | 
						||
(defmacro defclassmethod (classname &rest methods)
 | 
						||
    `(defmethod ,(metaclass-name  (class (symbol-value classname)))
 | 
						||
		. ,methods))
 | 
						||
(defun delete-method (classobj methodname)
 | 
						||
   (setf (metaclass-methods classobj)
 | 
						||
	 (delete methodname (metaclass-methods classobj) :key #'car))
 | 
						||
   (system::method-cache t))
 | 
						||
 | 
						||
;;;
 | 
						||
;;;	defclass macro (T.Matsui 1988-Jun)
 | 
						||
;;;
 | 
						||
 | 
						||
(defun make-class (name &key
 | 
						||
				(super object)	
 | 
						||
				(include object)
 | 
						||
				(printer nil)
 | 
						||
				(constructor nil)
 | 
						||
				(predicate nil)
 | 
						||
				(copier nil)
 | 
						||
				((:metaclass metaklass) nil)
 | 
						||
				(element-type nil)
 | 
						||
				(size -1)
 | 
						||
				((:slots varlist) nil) 
 | 
						||
				(documentation nil))
 | 
						||
  (if (symbolp super) (setq super (symbol-value super)))
 | 
						||
  (let ((classobj (if (boundp name) (symbol-value name)))
 | 
						||
        (variables) (types) (forwards)
 | 
						||
        (etype) (index 0) (accessor) (p))
 | 
						||
     (cond ((null (classp classobj))
 | 
						||
		(cond 
 | 
						||
		    (metaklass)
 | 
						||
		    ((classp metaklass))
 | 
						||
		    (super (setq metaklass (class super)))
 | 
						||
		    (t     (setq metaklass (symbol-value 'metaclass))))
 | 
						||
		(setq classobj (instantiate metaklass)))
 | 
						||
	   (t (setq metaklass (class classobj))))
 | 
						||
     (setq variables (nreverse (coerce (super . vars) cons))
 | 
						||
	   types (nreverse (coerce (super . types) cons))
 | 
						||
	   forwards (nreverse (coerce (super . forwards) cons)))
 | 
						||
     (dolist (v varlist)
 | 
						||
	(cond ((consp v)
 | 
						||
		(if (member (car v) variables)
 | 
						||
		    (error "duplicated object variable name"))
 | 
						||
		(push (car v) variables)
 | 
						||
		(setq p (position :type v))
 | 
						||
		(push (if p (elt v (1+ p)) t) types)
 | 
						||
		(setq p (position :forward v))
 | 
						||
		(push (if p (elt v (1+ p)) nil) forwards))
 | 
						||
	      ((symbolp v)
 | 
						||
		(if (member v variables)
 | 
						||
		    (error "duplicated object variable name"))
 | 
						||
		(push v variables)
 | 
						||
		(push t types)
 | 
						||
		(push nil forwards))
 | 
						||
	      (t (error "variable name expected for :slots"))))
 | 
						||
     (setq variables (coerce (nreverse variables) vector)
 | 
						||
	   types (coerce (nreverse types) vector)
 | 
						||
	   forwards (coerce (nreverse forwards) vector))
 | 
						||
     (setq etype (cdr (assq element-type 
 | 
						||
			'((:BIT . 1) (:CHAR . 2) (:BYTE . 3)
 | 
						||
			  (:INTEGER . 4) (:FLOAT . 5) (:FOREIGN . 6)))))
 | 
						||
     (if (null etype)
 | 
						||
         (setq etype   (if (subclassp metaklass vectorclass)
 | 
						||
			   (vectorclass-element-type super)
 | 
						||
			   0)))
 | 
						||
     (setq (classobj . name) name
 | 
						||
	   (classobj . vars) variables
 | 
						||
	   (classobj . types) types
 | 
						||
	   (classobj . forwards) forwards
 | 
						||
	   (classobj . super) super)
 | 
						||
     (if (subclassp metaklass vectorclass)
 | 
						||
	 (setq  (classobj . element-type) etype
 | 
						||
		(classobj . size) size))
 | 
						||
     (if (null (classobj . cix))   (enter-class classobj))
 | 
						||
;;;???
 | 
						||
;;;     (proclaim (list 'special name))
 | 
						||
;;      (set name classobj)
 | 
						||
;;     (send name :global classobj)
 | 
						||
     (putprop name documentation :class-documentation)
 | 
						||
;; define slot access functions and setf methods for all variables
 | 
						||
     (setq variables (coerce  variables  cons))
 | 
						||
     (dolist (v variables)
 | 
						||
	(setq accessor (intern (concatenate string
 | 
						||
					    (string name) "-" (string v))))
 | 
						||
	(setf (symbol-function accessor)
 | 
						||
	      `(macro (obj) (list 'slot obj ',name ,index)))
 | 
						||
	(incf index))
 | 
						||
     classobj ))
 | 
						||
 | 
						||
 | 
						||
(defmacro defstruct (name &rest slots)
 | 
						||
   `(progn
 | 
						||
	    (send ',name :global
 | 
						||
		(make-class ',name :slots ',slots))
 | 
						||
	    ',name))
 | 
						||
 | 
						||
 | 
						||
(defmacro defclass (name &key slots
 | 
						||
			      (super 'object)
 | 
						||
			      (size -1)
 | 
						||
			      ((:metaclass metaklass) nil)
 | 
						||
			      element-type
 | 
						||
			      documentation
 | 
						||
			      (doc documentation))
 | 
						||
	`(progn
 | 
						||
	    (send ',name :global
 | 
						||
	        (make-class ',name
 | 
						||
		    :super ,super
 | 
						||
		    :slots ',slots
 | 
						||
		    :metaclass ,metaklass
 | 
						||
		    :element-type ,element-type
 | 
						||
		    :size ,size
 | 
						||
		    :documentation ,doc) )
 | 
						||
	    ',name))
 | 
						||
 | 
						||
 | 
						||
;;; 
 | 
						||
;;; READTABLES
 | 
						||
;;;
 | 
						||
(eval-when (load eval)
 | 
						||
(defun readtablep (x) (derivedp x readtable))
 | 
						||
(defun copy-readtable (&optional (from *readtable*) (to nil))
 | 
						||
   (when (null from) (setq from *default-readtable*))
 | 
						||
   (when (null to)
 | 
						||
      (setq to (instantiate readtable))
 | 
						||
      (setf (readtable-syntax to) (instantiate string 256)
 | 
						||
	    (readtable-macro to) (instantiate vector 256)
 | 
						||
	    (readtable-dispatch-macro to) (instantiate vector 256)))
 | 
						||
   (if (or (null (readtablep from)) (null (readtablep to))) 
 | 
						||
       (error "readtable expected"))
 | 
						||
   (replace (readtable-syntax to) (readtable-syntax from))
 | 
						||
   (replace (readtable-macro to) (readtable-macro from))
 | 
						||
   (replace (readtable-dispatch-macro to) (readtable-dispatch-macro from))
 | 
						||
   (setf (readtable-case to) (readtable-case from))
 | 
						||
   to)
 | 
						||
 | 
						||
(defun set-syntax-from-char
 | 
						||
	 (to-char from-char &optional (to-readtable *readtable*)
 | 
						||
				      (from-readtable *default-readtable*))
 | 
						||
   (let (syn)
 | 
						||
      (setq syn (aref (readtable-syntax from-readtable) from-char))
 | 
						||
      (aset (readtable-syntax to-readtable) to-char syn)
 | 
						||
      (if (or (eq syn 7) (eq syn 8))
 | 
						||
	  (aset (readtable-macro to-readtable) to-char
 | 
						||
		(aref (readtable-macro from-readtable) from-char)))
 | 
						||
      syn))
 | 
						||
)
 | 
						||
 | 
						||
 | 
						||
;;
 | 
						||
;;	predicates
 | 
						||
;;
 | 
						||
(eval-when (load eval)
 | 
						||
(defun keywordp (sym)
 | 
						||
   (declare (type symbol sym))
 | 
						||
   (and (symbolp sym) (eq (sym . homepkg) *keyword-package*)))
 | 
						||
 | 
						||
(defun constantp (obj)
 | 
						||
   (declare (type symbol obj))
 | 
						||
   (if (symbolp obj)
 | 
						||
	(if (or (keywordp obj) (eq (obj . vtype) 0)) t nil)
 | 
						||
	(if (listp obj)
 | 
						||
	    (if (eq (car obj) 'quote) t nil)
 | 
						||
	    (if (atom obj) t nil))))
 | 
						||
 | 
						||
(defun functionp (obj)
 | 
						||
  (cond ((numberp obj) nil)
 | 
						||
	((listp obj) 
 | 
						||
	    (if (or (memq (car obj) '(lambda lambda-closure))) t nil))
 | 
						||
	((derivedp obj compiled-code)
 | 
						||
	  (eq (compiled-code-type obj) 0))
 | 
						||
	((and (symbolp obj) (fboundp obj))
 | 
						||
	 (functionp (symbol-function obj)))
 | 
						||
	(t nil)))
 | 
						||
 | 
						||
(defun vector-class-p (p) (derivedp p vectorclass))
 | 
						||
(defun compiled-function-p (x) (derivedp  x compiled-code))
 | 
						||
(defun input-stream-p (obj)
 | 
						||
  (declare (stream obj))
 | 
						||
  (or (and (derivedp obj stream)  (eq (obj . direction) :input))
 | 
						||
      (derivedp obj io-stream)))
 | 
						||
(defun output-stream-p (obj)
 | 
						||
  (declare (stream obj))
 | 
						||
  (or (and (derivedp obj stream)  (eq (obj . direction) :output))
 | 
						||
      (derivedp obj io-stream)))
 | 
						||
(defun io-stream-p (obj) (derivedp obj io-stream))
 | 
						||
 | 
						||
(defun special-form-p (s)
 | 
						||
  (and (symbolp s)
 | 
						||
       (fboundp s)
 | 
						||
       (setq s (symbol-function s))
 | 
						||
       (compiled-function-p s)
 | 
						||
       (eq (s . type) 2)))
 | 
						||
 | 
						||
(defun macro-function (s)
 | 
						||
  (and (symbolp s)
 | 
						||
       (fboundp s)
 | 
						||
       (setq s (symbol-function s))
 | 
						||
       (if (and (compiled-function-p s)
 | 
						||
	        (eq (s . type) 1))
 | 
						||
	   s
 | 
						||
	   (if (and (listp s) (eq (car s) 'macro)) s nil)
 | 
						||
       )))
 | 
						||
 | 
						||
(defun zerop (n) (= n 0))
 | 
						||
(defun plusp (n) (> n 0))
 | 
						||
(defun minusp (n) (< n 0))
 | 
						||
(defun oddp (n) (logbitp 0 n))
 | 
						||
(defun evenp (n) (not (logbitp 0 n)))
 | 
						||
(defun /= (n1 n2) (not (= n1 n2)))
 | 
						||
(defun logandc1 (x y) (logand (lognot x) y))
 | 
						||
(defun logandc2 (x y) (logand x (lognot y)))
 | 
						||
(defmacro ecase (&rest x) (cons 'case x))
 | 
						||
 | 
						||
(defun every (pred arg &rest more-args)
 | 
						||
  (cond ((and (null more-args) (listp arg))
 | 
						||
	 (while arg (unless (funcall pred (pop arg)) (return-from every nil))))
 | 
						||
	(t
 | 
						||
	 (setq arg (cons arg more-args))
 | 
						||
	 (dotimes (i (length (car arg)))
 | 
						||
	     (unless (apply pred (mapcar #'(lambda (x) (elt x i)) arg))
 | 
						||
		     (return-from every nil)))))
 | 
						||
   t)
 | 
						||
 | 
						||
(defun some (pred arg &rest more-args &aux result)
 | 
						||
   (setq arg (cons arg more-args))
 | 
						||
   (dotimes (i (length (car arg)))
 | 
						||
        (if (setq result (apply pred (mapcar #'(lambda (x) (elt x i)) arg)))
 | 
						||
	    (return-from some result)))
 | 
						||
   nil)
 | 
						||
)
 | 
						||
 | 
						||
(eval-when (load eval)
 | 
						||
(defun reduce (func seq &key (start 0) (end (length seq))
 | 
						||
			     from-end initial-value)
 | 
						||
   (let ((length (- end start)))
 | 
						||
      (when from-end (setq seq (reverse seq)))
 | 
						||
      (cond
 | 
						||
	 ((and (= length 1) (null initial-value)) (elt seq start))
 | 
						||
	 ((= length 0)
 | 
						||
	  (if initial-value initial-value (funcall func)))
 | 
						||
	 (t
 | 
						||
	   (unless initial-value
 | 
						||
		(setq initial-value
 | 
						||
		      (funcall func (elt seq start) (elt seq (inc start))))
 | 
						||
		(dec length 2) (inc start))
 | 
						||
	   (dotimes (i length)
 | 
						||
	     (setq initial-value
 | 
						||
		   (funcall func initial-value (elt seq (+ start i)))))
 | 
						||
	   initial-value))))
 | 
						||
 | 
						||
(defun merge-list (list1 list2 pred key &aux result p1 e1 e2 pp1 pp2)
 | 
						||
   (while (and list2  (not (funcall pred (funcall key (car list1))
 | 
						||
				         (funcall key (car list2)))))
 | 
						||
      (push (pop list2) result))
 | 
						||
   (setq result (nreverse result))
 | 
						||
   (setq p1 list1)
 | 
						||
   (while (and list2 (cdr p1))
 | 
						||
      (setq e2 (funcall key (car list2)))
 | 
						||
      (while (and p1 (funcall pred (funcall key (cadr p1)) e2)) (pop p1))
 | 
						||
      (when p1
 | 
						||
	 (setf pp1 (cdr p1)
 | 
						||
	       pp2 (cdr list2)
 | 
						||
	       (cdr p1) list2
 | 
						||
	       (cdr list2) pp1
 | 
						||
	       p1 list2
 | 
						||
	       list2 pp2)) )
 | 
						||
   (nconc result list1 list2))
 | 
						||
 | 
						||
(defun merge (result-class seq1 seq2 pred &key (key #'identity))
 | 
						||
   (if (and (eq result-class cons) (listp seq1) (listp seq2))
 | 
						||
       (merge-list seq1 seq2 pred key)
 | 
						||
       (let* ((l1 (length seq1)) (l2 (length seq2)) (l (+ l1 l2))
 | 
						||
	      (result (make-sequence result-class l))
 | 
						||
	      (i1 0) (i2 0) (j 0) (e1) (e2) (e))
 | 
						||
          (while (< j l)
 | 
						||
	    (cond ((>= i1 l1) (setq e (elt seq2 i2)) (inc i2))
 | 
						||
	          ((>= i2 l2) (setq e (elt seq1 i1)) (inc i1))
 | 
						||
	          (t (setq e1 (elt seq1 i1)
 | 
						||
		           e2 (elt seq2 i2))
 | 
						||
		     (if (funcall pred (funcall key e1) (funcall key e2))
 | 
						||
		         (progn (inc i1) (setq e e1))
 | 
						||
		         (progn (inc i2) (setq e e2)))))
 | 
						||
	    (setf (elt result j) e)
 | 
						||
	    (inc j))
 | 
						||
          result)))
 | 
						||
)
 | 
						||
		   
 | 
						||
 | 
						||
;;
 | 
						||
;; arithmetics aux
 | 
						||
;;
 | 
						||
 | 
						||
(defun expt (a x)
 | 
						||
   (cond ((and (integerp x) (>= x 0))
 | 
						||
	  (if (zerop x)
 | 
						||
	      1
 | 
						||
	      (let ((b a) (y 1) (ix (1- x)))
 | 
						||
		(declare (integer y ix))
 | 
						||
		(while (> ix 0)
 | 
						||
		    (cond ((> ix y)
 | 
						||
			    (setq b (* b b)
 | 
						||
			    	  ix (- ix y)
 | 
						||
			    	  y (ash y 1)))
 | 
						||
			  (t (setq b (* b a) ix (1- ix)))))
 | 
						||
	        b)))
 | 
						||
	 (t (exp (* x (log a))))))
 | 
						||
(defun signum (x) (if (zerop x) x (/ x (abs x))))
 | 
						||
(defun rad2deg (rad) (/ (* 360.0 rad) 2pi))
 | 
						||
(defun deg2rad (deg) (/ (* 2pi deg) 360.0))
 | 
						||
)
 | 
						||
 | 
						||
;;;; (C) Copyright Taiichi Yuasa and Masami Hagiya, 1984. All rights reserved.
 | 
						||
;;;;
 | 
						||
;;;;                                setf routines
 | 
						||
;;;;	Modified by T.Matsui to be run on euslisp
 | 
						||
;;;;	1988-Jun-27
 | 
						||
 | 
						||
;;; DEFSETF macro.
 | 
						||
(defmacro defsetf (access-fn &rest rest)
 | 
						||
  (cond ((and (car rest) (or (symbolp (car rest)) (functionp (car rest))))
 | 
						||
         `(progn (putprop ',access-fn ',(car rest) 'setf-update-fn)
 | 
						||
                 (remprop ',access-fn 'setf-lambda)
 | 
						||
                 (remprop ',access-fn 'setf-method)
 | 
						||
                 (putprop ',access-fn
 | 
						||
                             ,(when (not (endp (cdr rest)))
 | 
						||
                                    (unless (stringp (cadr rest))
 | 
						||
                                            (error "A doc-string expected."))
 | 
						||
                                    (unless (endp (cddr rest))
 | 
						||
                                            (error "Extra arguments."))
 | 
						||
                                    (cadr rest))
 | 
						||
                             'setf-documentation)
 | 
						||
                 ',access-fn))
 | 
						||
	(t
 | 
						||
	 (unless (= (list-length (cadr rest)) 1)
 | 
						||
		 (error "(store-variable) expected."))
 | 
						||
         `(progn (putprop ',access-fn ',rest 'setf-lambda)
 | 
						||
                 (remprop ',access-fn 'setf-update-fn)
 | 
						||
                 (remprop ',access-fn 'setf-method)
 | 
						||
;                 (putprop ',access-fn
 | 
						||
;                             ,(find-documentation (cddr rest))
 | 
						||
;                             'setf-documentation)
 | 
						||
                 ',access-fn))))
 | 
						||
 | 
						||
 | 
						||
;;; DEFINE-SETF-METHOD macro.
 | 
						||
(defmacro define-setf-method (access-fn &rest rest)
 | 
						||
  `(progn (putprop ',access-fn #'(lambda ,@rest) 'setf-method)
 | 
						||
          (remprop ',access-fn 'setf-lambda)
 | 
						||
          (remprop ',access-fn 'setf-update-fn)
 | 
						||
;          (putprop ',access-fn
 | 
						||
;                      ,(find-documentation (cdr rest))
 | 
						||
;                      'setf-documentation)
 | 
						||
          ',access-fn))
 | 
						||
 | 
						||
;;; The expansion function for SETF.
 | 
						||
(defun setf-expand-1 (place newvalue)
 | 
						||
 (let (g)
 | 
						||
  (setq place (macroexpand place))
 | 
						||
  (cond ((and (consp place) (eq (car place) 'the))
 | 
						||
          (setf-expand-1 (caddr place) `(the ,(cadr place) ,newvalue)))
 | 
						||
        ((symbolp place)  `(setq ,place ,newvalue))
 | 
						||
        ((and (symbolp (car place)) (setq g (get (car place) 'setf-update-fn)))
 | 
						||
         `(,g ,@(cdr place) ,newvalue))
 | 
						||
        ((and (symbolp (car place))
 | 
						||
             (setq g (get (car place) 'structure-access))
 | 
						||
             (get (car place) 'setf-lambda)
 | 
						||
             (not (eq (car g) 'list))
 | 
						||
             (not (eq (car g) 'vector)))
 | 
						||
          `(system::structure-set ,(cadr place) ',(car g) ,(cdr g) ,newvalue))
 | 
						||
	((macro-function (car place))
 | 
						||
	 (setf-expand-1 (macroexpand place) newvalue))
 | 
						||
	((setq g (get (car place) 'setf-lambda))
 | 
						||
	   (apply (append '(lambda) (list (append (cadr g) (car g))) (cddr g))
 | 
						||
		  newvalue (cdr place)))
 | 
						||
;	((get (car place) 'setf-method)
 | 
						||
;	 (apply (get (car form) 'setf-method) (cdr place)))
 | 
						||
	(t (error "SETF?")))))
 | 
						||
 | 
						||
(defun setf-expand (l)
 | 
						||
  (cond ((endp l) nil)
 | 
						||
        ((endp (cdr l)) (error "~S is an illegal SETF form." l))
 | 
						||
        (t
 | 
						||
         (cons (setf-expand-1 (car l) (cadr l))
 | 
						||
               (setf-expand (cddr l))))))
 | 
						||
 | 
						||
 | 
						||
;;; SETF macro.
 | 
						||
(defmacro setf (&rest rest)
 | 
						||
  (cond ((endp rest) nil)
 | 
						||
        ((endp (cdr rest)) (error "~S is an illegal SETF form." rest))
 | 
						||
        ((endp (cddr rest)) (setf-expand-1 (car rest) (cadr rest)))
 | 
						||
        (t (cons 'progn (setf-expand rest)))))
 | 
						||
 | 
						||
;(defmacro incf (form &optional (d 1))
 | 
						||
;  `(setf ,form (+ ,form ,d)))
 | 
						||
;(defmacro decf (form &optional (d 1))
 | 
						||
;  `(setf ,form (- ,form ,d)))
 | 
						||
 | 
						||
;;;
 | 
						||
;;;  MULTI-VALUE simulation macros
 | 
						||
;;;
 | 
						||
(defmacro multiple-value-bind (vlist init &rest forms)
 | 
						||
   (let* ((inits (gensym "MULT")) (vilist) (count 0))
 | 
						||
      (dolist (v vlist)
 | 
						||
	 (push (list v `(elt ,inits ,count)) vilist)
 | 
						||
         (inc count))
 | 
						||
      `(let* ((,inits ,init) . ,vilist) . ,forms)))
 | 
						||
 | 
						||
(defmacro multiple-value-setq (vlist form)
 | 
						||
   (let ((i 0) (tempvar (gensym "MULT")) setq-forms)
 | 
						||
     (dolist (v vlist)
 | 
						||
	(push (list
 | 
						||
		(second
 | 
						||
		   (assoc i
 | 
						||
			'((0 first) (1 second) (2 third)
 | 
						||
			(3 fourth)(4 fifth) (5 sixth) (6 seventh))))
 | 
						||
		tempvar)
 | 
						||
	      setq-forms)
 | 
						||
	(push v setq-forms)
 | 
						||
	(incf i))
 | 
						||
    `(let ((,tempvar ,form))
 | 
						||
	(setq . ,setq-forms))))
 | 
						||
 | 
						||
(alias 'values  'list)
 | 
						||
 | 
						||
#|
 | 
						||
(defun quick-sort (sequence start end predicate key &aux (j 0) (k 0) exch)
 | 
						||
  (declare (fixnum start end j k))
 | 
						||
  (when (<= end (the fixnum (1+ start)))
 | 
						||
        (return-from quick-sort sequence))
 | 
						||
  (setq j start)
 | 
						||
  (setq k (1- end))
 | 
						||
  (do ((d (aref sequence start)))
 | 
						||
      ((> j k))
 | 
						||
    (do ()
 | 
						||
	((or (> j k)
 | 
						||
	     (funcall predicate
 | 
						||
		      (funcall key (aref sequence k))
 | 
						||
		      (funcall key d))))
 | 
						||
      (decf k))
 | 
						||
    (when (< k start)
 | 
						||
	  (quick-sort sequence (1+ start) end predicate key)
 | 
						||
	  (return-from quick-sort sequence))
 | 
						||
    (do ()
 | 
						||
	((or (> j k)
 | 
						||
	     (not (funcall predicate
 | 
						||
			   (funcall key (aref sequence j))
 | 
						||
			   (funcall key d)))))
 | 
						||
      (incf j))
 | 
						||
    (when (> j k) (return))
 | 
						||
    (setf exch (aref sequence k)
 | 
						||
	  (aref sequence k) (aref sequence j)
 | 
						||
	  (aref sequence j) exch)
 | 
						||
    (incf j)
 | 
						||
    (decf k))
 | 
						||
  (quick-sort sequence start j predicate key)
 | 
						||
  (quick-sort sequence j end predicate key)
 | 
						||
  sequence)
 | 
						||
 | 
						||
(defun qsort (seq test &optional (key #'identity) &aux (vec nil) (s nil))
 | 
						||
  (cond ((null seq) nil)
 | 
						||
	((listp seq)
 | 
						||
	 (setq vec (coerce seq vector))
 | 
						||
	 (quick-sort vec 0 (length seq) test key)
 | 
						||
	 (setq s seq)
 | 
						||
	 (dotimes (i (length vec))
 | 
						||
	    (rplaca s (aref vec i))
 | 
						||
	    (setq s (cdr s)))
 | 
						||
	 seq)
 | 
						||
	((vectorp seq)
 | 
						||
	 (quick-sort seq 0 (length seq) test key)
 | 
						||
	 seq) ))
 | 
						||
|#
 | 
						||
 | 
						||
#|
 | 
						||
(eval-when (load eval)
 | 
						||
   (defmacro pop (s) `(prog1 (car ,s) (setf ,s (cdr ,s))))
 | 
						||
   (defmacro push (item place) `(setf ,place (cons ,item ,place)))
 | 
						||
 )
 | 
						||
|#
 | 
						||
 | 
						||
 |