Annotation of 43BSD/ucb/lisp/lisplib/machacks.l, revision 1.1.1.1

1.1       root        1: (setq rcs-machacks-
                      2:    "$Header: machacks.l 1.5 83/07/05 00:04:09 jkf Exp $")
                      3: 
                      4: ;; (c) copywrite 1982, University of California, Berkeley
                      5: ;; (c) copywrite 1982, Massachusetts Insititute of Technology
                      6: 
                      7: ;; This file was originally written at the University of California,
                      8: ;; Berkeley.  Some portions were modified and additions made were made at
                      9: ;; MIT.
                     10: 
                     11: ;; machacks - maclisp compatibility package.
                     12: ;; when this file is fasl'ed into a lisp, it will change the syntax to
                     13: ;; maclisp's syntax and will define functions know to the standard maclisp.
                     14: ;; it is also used to bootstrap vaxima compilation.
                     15: ;
                     16: ; this file will be fasled whenever the -m switch is set for compilation.
                     17: ;
                     18: 
                     19: (declare (macros t))
                     20: 
                     21: (def coutput
                     22:   (lambda (msg)
                     23:          (print msg)   ; should go to unfasl port
                     24:          (terpr)))
                     25: 
                     26: ;--- displace 
                     27: ; this is useful after a macro has been expanded and you want to save the
                     28: ; interpreter the trouble of expanding the macro again.  
                     29: ; [this is really only useful for interpretation]
                     30: (defun displace (old-form new-form)
                     31:        (cond ((atom old-form)
                     32:              (error '|not able to displace this form| old-form))
                     33:             ((atom new-form)
                     34:              (rplaca old-form 'progn)
                     35:              (rplacd old-form (list new-form)))
                     36:             (t (rplaca old-form (car new-form))
                     37:                (rplacd old-form (cdr new-form)))))
                     38: 
                     39: 
                     40: 
                     41: ;--- fboundp  :: check if a symbol has a function binding
                     42: ;
                     43: (defmacro fboundp (form &protect (form)) `(and (symbolp ,form) (getd ,form)))
                     44: 
                     45: 
                     46: 
                     47: 
                     48: (defmacro list* (&rest forms)
                     49:          (cond ((null forms) nil)
                     50:                ((null (cdr forms)) (car forms))
                     51:                (t (construct-list* forms))))
                     52: 
                     53: (eval-when (load compile eval)
                     54:    (defun construct-list* (forms)
                     55:          (setq forms (reverse forms))
                     56:          (do ((forms (cddr forms) (cdr forms))
                     57:               (return-form `(cons ,(cadr forms) ,(car forms))
                     58:                             `(cons ,(car forms) ,return-form)))
                     59:              ((null forms) return-form))))
                     60: 
                     61: (defmacro ttf (&rest l) `(list* . , l))
                     62: 
                     63: 
                     64: ;; lexpr-funcall is a cross between apply and funcall.  the last arguments
                     65: ;; is a list of the rest of the arguments
                     66: ;; this is now in Franz Opus 38.35
                     67: ;; (defmacro lexpr-funcall (func &rest args)
                     68: ;;    `(apply ,func (list* ,@args)))
                     69: 
                     70: ; contents of the file libmax;macros  all of these functions are
                     71: ; (by default) in maclisp
                     72: ;; (if x p q1 q2 ...) --> (cond (x p) (t q1 q2 ...))
                     73: ;; it is important that (if nil <form>) returns nil as macsyma code depends
                     74: ;; upon this in places.  see also ifn in libmax;maxmac.
                     75: ; in Franz Lisp, opus 38.36 and on
                     76: ;(defmacro if (predicate then &rest else)
                     77: ;        (cond ((null else) `(cond (,predicate ,then)))
                     78: ;              (t `(cond (,predicate ,then) (t . ,else)))))
                     79: 
                     80: ;; let, let*, list* are now a part of multics lisp.  nobody should miss
                     81: ;; the code commented out below.
                     82: ;; (let ((a 3) (b) c) stuff) --> ((lambda (a b c) stuff) 3 nil nil)
                     83: ;; (let* ((a 3) (b 4)) stuff) --> ((lambda (a) ((lambda (b) stuff) 4)) 3)
                     84: 
                     85: ;; (push x s) --> (setq s (cons x s))
                     86: ; in franz
                     87: ;(defmacro push (object list) `(setf ,list (cons ,object ,list)))
                     88: 
                     89: ;; (pop s) -->   (prog1 (car s) (setf s (cdr s)))
                     90: ;; (pop s v) --> (prog1 (setf v (car s)) (setf s (cdr s)))
                     91: ;; this relies on the fact that setf returns the value stored.
                     92: 
                     93: ;(defmacro pop (list &optional (into nil into-p))
                     94: ;  (cond (into-p `(prog1 (setf ,into (car ,list))
                     95: ;                        (setf ,list (cdr ,list))))
                     96: ;        (t `(prog1 (car ,list)
                     97: ;                   (setf ,list (cdr ,list))))))
                     98: 
                     99: ;; (for i m n . body) will evaluate body with i bound to m,m+1,...,n-1
                    100: ;; sequentially.  (for i 0 n . body) --> (dotimes (i n) . body)
                    101: 
                    102: (defmacro for (var start stop . body)
                    103:           `(do ,var ,start (1+ ,var) (= ,var ,stop) ,@body))
                    104: 
                    105: ; these were grabbed from lspsrc;umlmac.5
                    106: (defmacro when (p . c) `(cond (,p . ,c)))
                    107: (defmacro unless (p . c) `(cond ((not ,p) . ,c)))
                    108: 
                    109: 
                    110: (defmacro if-for-maclisp-else-lispm (&rest ll) (car ll))
                    111: 
                    112: (defmacro logand (&rest forms) `(boole 1 . ,forms))
                    113: (defmacro logior (&rest forms) `(boole 7 . ,forms))
                    114: (defmacro logxor (&rest forms) `(boole 6 . ,forms))
                    115: (defmacro lognot (n) `(boole 10. ,n -1))
                    116: (defmacro bit-test (&rest forms) `(not (zerop (boole 1 . ,forms))))
                    117: (defmacro bit-set (x y) `(boole 7 ,x ,y))
                    118: (defmacro bit-clear (x y) `(boole 2 ,x ,y))
                    119: 
                    120: ;; (<= a b) --> (not (> a b))
                    121: ;; (<= a b c) --> (not (or (> a b) (> b c)))
                    122: ;; funny arglist to check for correct number of arguments.
                    123: 
                    124: (defmacro <= (arg1 arg2 &rest rest &aux result)
                    125:   (setq rest (list* arg1 arg2 rest))
                    126:   (do l rest (cdr l) (null (cdr l))
                    127:       (push `(> ,(car l) ,(cadr l)) result))
                    128:   (cond ((null (cdr result)) `(not ,(car result)))
                    129:        (t `(not (or . ,(nreverse result))))))
                    130: 
                    131: ;; (>= a b) --> (not (< a b))
                    132: ;; (>= a b c) --> (not (or (< a b) (< b c)))
                    133: ;; funny arglist to check for correct number of arguments.
                    134: 
                    135: (defmacro >= (arg1 arg2 &rest rest &aux result)
                    136:   (setq rest (list* arg1 arg2 rest))
                    137:   (do l rest (cdr l) (null (cdr l))
                    138:       (push `(< ,(car l) ,(cadr l)) result))
                    139:   (cond ((null (cdr result)) `(not ,(car result)))
                    140:        (t `(not (or . ,(nreverse result))))))
                    141: 
                    142: 
                    143: 
                    144: (defmacro psetq (var value . rest)
                    145:   (cond (rest `(setq ,var (prog1 ,value (psetq . ,rest))))
                    146:        (t `(setq ,var ,value))))
                    147: 
                    148:  
                    149: ;; (dotimes (i n) body) evaluates body n times, with i bound to 0, 1, ..., n-1.
                    150: ;; (dolist (x l) body) successively binds x to the elements of l, and evaluates
                    151: ;; body each time.
                    152: 
                    153: ;; things to beware of:
                    154: ;; [1] this won't work for count being a bignum.
                    155: ;; [2] if count is a symbol, somebody could clobber its value inside the body.
                    156: ;; [3] somebody inside of body could reference **count**.
                    157: 
                    158: (defmacro dotimes ((var count) . body)
                    159:   (if (or (fixp count) (symbolp count))
                    160:       `(do ((,var 0 (1+ ,var)))
                    161:           ((>= ,var ,count))
                    162:           (declare (fixnum ,var))
                    163:           . ,body)
                    164:       `(do ((,var 0 (1+ ,var))
                    165:            (**count** ,count))
                    166:           ((>= ,var **count**))
                    167:           (declare (fixnum ,var **count**))
                    168:           . ,body)))
                    169: 
                    170: (defmacro dolist ((var list) . body)
                    171:   `(do ((**list** ,list (cdr **list**))
                    172:        (,var))
                    173:        ((null **list**))
                    174:        (setq ,var (car **list**))
                    175:        . ,body))
                    176: 
                    177: 
                    178: ;; symbolconc is the same as concat in franz
                    179: ;
                    180: (defmacro symbolconc (&rest args) `(concat ,@args))
                    181: 
                    182: 
                    183: ;-- these functions are from /usr/lib/lisp/lmhacks on the mit-vax
                    184: 
                    185: ;;  This file contains miscellaneous functions and macros that 
                    186: ;;  ZetaLisp users often find useful
                    187: 
                    188: (declare (macros t))
                    189: 
                    190: (defmacro macro (name argl &body body)
                    191:   `(def ,name (macro ,argl ,@body)))
                    192: 
                    193: (defun gcd (a b)
                    194:   (or (plusp a)
                    195:       (setq a (minus a)))
                    196:   (or (plusp b)
                    197:       (setq b (minus b)))
                    198:   (do ((a a b)
                    199:        (b b (remainder a b)))
                    200:       ((zerop b)
                    201:        a)))
                    202: 
                    203: (defmacro first (a) `(car ,a))
                    204: (defmacro second (a) `(cadr ,a))
                    205: (defmacro third (a) `(caddr ,a))
                    206: (defmacro fourth (a) `(cadddr ,a))
                    207: (defmacro fifth (a) `(car (cddddr ,a)))
                    208: (defmacro sixth (a) `(cadr (cddddr ,a)))
                    209: (defmacro seventh (a) `(caddr (cddddr ,a)))
                    210: 
                    211: (defmacro rest1 (list) `(cdr ,list))
                    212: (defmacro rest2 (list) `(cddr ,list))
                    213: (defmacro rest3 (list) `(cdddr ,list))
                    214: (defmacro rest4 (list) `(cddddr ,list))
                    215: 
                    216: (defmacro copylist (list) `(append ,list nil))
                    217: (defmacro copytree (list) `(subst nil nil ,list))
                    218: 
                    219: (defun circular-list (&rest elements)
                    220:   (setq elements (copylist elements))
                    221:   (rplacd (last elements) elements)
                    222:   elements)
                    223: 
                    224: (defun butlast (x)
                    225:   (cond ((null (cdr x)) nil)
                    226:        (t (cons (car x) (butlast (cdr x))))))
                    227: 
                    228: (defun find-position-in-list (item list)
                    229:   (do ((i 0 (1+ i)))
                    230:       ((null list) nil)
                    231:     (if (eq (car list) item)
                    232:        (return i)
                    233:        (setq list (cdr list)))))
                    234: 
                    235: (defun find-postion-in-list-equal (item list)
                    236:   (do ((i 0 (1+ i)))
                    237:       ((null list) nil)
                    238:     (if (equal (car list) item)
                    239:        (return i)
                    240:        (setq list (cdr list)))))
                    241: 
                    242: (defun mem (pred item list)
                    243:   (do ()
                    244:       ((null list) nil)
                    245:       (if (funcall pred item (car list))
                    246:          (return list))
                    247:       (setq list (cdr list))))
                    248: 
                    249: 
                    250: 
                    251: ;--- remq is in common2.l
                    252: 
                    253: 
                    254: 
                    255: (defun rem (pred item list &optional (cnt -1))
                    256:   (let ((head '())
                    257:        (tail nil))
                    258:     (do ((l list (cdr l))
                    259:         (newcell))
                    260:        ((null l) head)
                    261:       (cond ((or (funcall pred (car l) item)
                    262:                 (zerop cnt))
                    263:             (setq newcell (list (car l)))
                    264:             (cond ((null head) (setq head newcell))
                    265:                   (t (rplacd tail newcell)))
                    266:             (setq tail newcell))
                    267:            (t (setq cnt (1- cnt)))))))
                    268: 
                    269: (defun rem-if (pred list)
                    270:   (let ((head '())
                    271:        (tail nil))
                    272:     (do ((l list (cdr l))
                    273:         (newcell))
                    274:        ((null l) head)
                    275:       (cond ((not (funcall pred (car l)))
                    276:             (setq newcell (list (car l)))
                    277:             (cond ((null head) (setq head newcell))
                    278:                   (t (rplacd tail newcell)))
                    279:             (setq tail newcell))))))
                    280: 
                    281: (defun rem-if-not (pred list)
                    282:   (let ((head '())
                    283:        (tail nil))
                    284:     (do ((l list (cdr l))
                    285:         (newcell))
                    286:        ((null l) head)
                    287:       (cond ((funcall pred (car l))
                    288:             (setq newcell (list (car l)))
                    289:             (cond ((null head) (setq head newcell))
                    290:                   (t (rplacd tail newcell)))
                    291:             (setq tail newcell))))))
                    292: 
                    293: (make-equivalent subset rem-if-not)
                    294: (make-equivalent subset-not rem-if)
                    295: 
                    296: (defun del (pred item list &optional (cnt -1))
                    297:   (let ((ret (cons nil list)))
                    298:     (do ((list ret))
                    299:        ((null (cdr list))
                    300:         (cdr ret))
                    301:       (cond ((and (funcall pred item (second list))
                    302:                 (not (zerop cnt)))
                    303:             (setq cnt (1- cnt))
                    304:             (rplacd list (cddr list)))
                    305:            (t (setq list (cdr list)))))))
                    306: 
                    307: (defun del-if (pred list)
                    308:   (let ((ret (cons nil list)))
                    309:     (do ((list ret))
                    310:        ((null (cdr list))
                    311:         (cdr ret))
                    312:        (if (funcall pred (second list))
                    313:            (rplacd list (cddr list))
                    314:            (setq list (cdr list))))))
                    315: 
                    316: (defun del-if-not (pred list)
                    317:   (let ((ret (cons nil list)))
                    318:     (do ((list ret))
                    319:        ((null (cdr list))
                    320:         (cdr ret))
                    321:        (if (not (funcall pred (second list)))
                    322:            (rplacd list (cddr list))
                    323:            (setq list (cdr list))))))
                    324: 
                    325: (defun some (forms pred &optional step-function)
                    326:   (and (not (null forms))
                    327:        (if (funcall pred (car forms))
                    328:           forms
                    329:           (some (if (null step-function)
                    330:                     (cdr forms)
                    331:                     (funcall step-function forms))
                    332:                 pred
                    333:                 step-function))))
                    334: 
                    335: (defun every (forms pred &optional step-function)
                    336:   (or (null forms)
                    337:       (and (funcall pred (car forms))
                    338:           (every (if (null step-function)
                    339:                      (cdr forms)
                    340:                      (funcall step-function forms))
                    341:                  pred
                    342:                  step-function))))
                    343: 
                    344: (defmacro pairp (x) `(dtpr ,x))
                    345: 
                    346: (defun tailp (subset set)
                    347:   (do ((s set (cdr s)))
                    348:       ((null s) nil)
                    349:       (cond ((eq s subset) (return t)))))
                    350: 
                    351: ; defunp
                    352: ; like defun except it's an implicit prog
                    353: ; expands
                    354: ;  (defunp fn (args) form1 form2 ... formn)
                    355: ; into
                    356: ;  (defun fn (args) (prog () form1 form2 ... (return (formn))))
                    357: ; and hence allows returns in the middle of "defun"'s
                    358: ; If original defun body is just one form (eg, let, cond, etc.)
                    359: ; return is wrapped around the whole thing.
                    360: ;
                    361: 
                    362: (defmacro defunp (fn arglist . body)
                    363:   `(defun ,fn ,arglist
                    364:      (prog ()
                    365:        ,@(let ((bodyrev (reverse body)))
                    366:              (nreconc (cdr bodyrev) 
                    367:                       (cond ((eq 'return (caar bodyrev))
                    368:                              ; last form is already a return
                    369:                              `(,(car bodyrev)))
                    370:                             (t `((return ,(car bodyrev))))))))))
                    371: 
                    372: (defmacro let-globally (vars-values . body)
                    373:   (let ((temp-vars (mapcar #'(lambda (q) (gensym)) vars-values)))
                    374:     `(progn ((lambda ,temp-vars ,@(mapcar #'(lambda (var-value value)
                    375:                                              `(setq ,(car var-value) ,value))
                    376:                                          vars-values temp-vars))
                    377:              ,@(mapcar #'cadr vars-values))
                    378:            ,@body)))
                    379: 
                    380: (defmacro local-declare (dcls . body)
                    381:     `(progn 'compile ,@(mapcar #'(lambda (x) `(declare ,x)) dcls) ,@body))
                    382: 
                    383: (defmacro defconst (variable &optional (initial-value nil iv-p) documentation)
                    384:   documentation ;; ignored for now.
                    385:   (if iv-p `(progn 'compile
                    386:                   (eval-when (eval compile load)
                    387:                              (declare (special ,variable)))
                    388:                   (setq ,variable ,initial-value))
                    389:       `(eval-when (eval compile load)
                    390:                  (declare (special ,variable)))))
                    391: 
                    392: (defmacro check-arg (var-name predicate description)
                    393:   `(if (not ,(if (atom predicate)
                    394:                 `(,predicate ,var-name)
                    395:                 predicate))
                    396:        (ferror t "The argument ~S was ~S, which is not ~A.~%"
                    397:               ',var-name ,var-name ,description)))
                    398: 
                    399: (defmacro check-arg-type (var-name type-name &optional description)
                    400:   `(if (not (typep ,var-name ,type-name)
                    401:        (ferror t "The argument ~s was ~S, which is not ~A~A.~%"
                    402:               ',var-name ,var-name
                    403:               ,(if (null description) " a" "")
                    404:               ,(if (null description) type-name description)))))
                    405: 
                    406: ;;; Defsubst
                    407: 
                    408: (defmacro defsubst (function-spec lambda-list &body body)
                    409:   `(progn 'compile
                    410:      (defun ,function-spec ,lambda-list ,@body)
                    411:      (defcmacro ,function-spec ,lambda-list
                    412:        (sublis (list ,@(do ((v lambda-list (cdr v))
                    413:                            (r nil (cons `(cons ',(car v) ,(car v)) r)))
                    414:                         ((null v) (nreverse r))))
                    415:               ',(if (null (cdr body)) (car body)
                    416:                    `(progn . ,body))))
                    417:      ',function-spec))
                    418: 
                    419: ;--- ^ :: fixnum expt
                    420: (defun ^ (x y)
                    421:   (expt x y))
                    422: 
                    423: (putprop 'machacks t 'version)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.