mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +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)))
|
||
)
|
||
|#
|
||
|
||
|