Annotation of 42BSD/ucb/lisp/lisplib/cmumacs.l, revision 1.1.1.1

1.1       root        1: ;; file of common cmu functions which should be macros 
                      2: ;; I hope that by just loading in the file an environment will be
                      3: ;; created which will permit the cmu files to be compiled.
                      4: 
                      5: (setq rcs-cmumacs-
                      6:    "$Header: /usr/lib/lisp/cmumacs.l,v 1.1 83/01/29 18:34:31 jkf Exp $")
                      7: 
                      8: (declare (macros t))
                      9: 
                     10: (eval-when (compile eval load)
                     11:    (or (boundp 'CMU-fcn-def) (setq CMU-fcn-def (getd 'def))))
                     12: 
                     13: ;-- contents
                     14: ;      dv      mark!changed    ***     list* [construct-list* lambda]
                     15: ;      neq     push    pop     mukname (equivlance)
                     16: ;      prin1 (equiv to print)  selectq lineread
                     17: ;
                     18: 
                     19: ;--- dv :: set variable to value and remember it was changed
                     20: ; (dv name value)   name is setq'ed to value (no evaluation) and
                     21: ;               the fact that it was done is remembered
                     22: ;
                     23: (defmacro dv (name value)
                     24:   `(progn 'compile
                     25:          (setq ,name ',value)
                     26:          (mark!changed ',name)))
                     27: 
                     28: (defmacro mark!changed (name)
                     29:   `(let ((atomname ,name))
                     30:         (and (boundp '%changes) (setq %changes (cons atomname %changes)))
                     31:        atomname))
                     32: 
                     33: ;--- *** :: comment macro
                     34: ;
                     35: (defmacro *** (&rest x) nil)
                     36: 
                     37: ;; this must be rewritten as a macro           ****
                     38: ;(def quote! (nlambda (a) (quote!-expr a)))
                     39: 
                     40: ; this will be thrown away if the code below it works
                     41: (def quote!-expr
                     42:      (lambda 
                     43:       (x)
                     44:       (cond ((atom x) x)
                     45:             ((eq (car x) '!)
                     46:              (cons (eval (cadr x)) (quote!-expr (cddr x))))
                     47:             ((eq (car x) '!!)
                     48:              (cond ((cddr x)
                     49:                     (append (eval (cadr x)) (quote!-expr (cddr x))))
                     50:                    (t (eval (cadr x)))))
                     51:             (t
                     52:              (prog (u v)
                     53:                    (setq u (quote!-expr (car x)))
                     54:                    (setq v (quote!-expr (cdr x)))
                     55:                    (cond ((and (eq u (car x)) (eq v (cdr x))) (return x)))
                     56:                    (return (cons u v)))))))
                     57: ;; this is probably what the above forms do. (jkf)
                     58: (defmacro quote! (&rest a) (quote!-expr-mac a))
                     59: (eval-when (compile eval load)
                     60:    
                     61: (defun quote!-expr-mac (form)
                     62:    (cond ((null form) nil)
                     63:         ((atom form) `',form)
                     64:         ((eq (car form) '!)
                     65:          `(cons ,(cadr form) ,(quote!-expr-mac (cddr form))))
                     66:         ((eq (car form) '!!)
                     67:          (cond ((cddr form) `(append ,(cadr form)
                     68:                                       ,(quote!-expr-mac (cddr form))))
                     69:                (t (cadr form))))
                     70:         (t `(cons ,(quote!-expr-mac (car form))
                     71:                    ,(quote!-expr-mac (cdr form))))))
                     72: 
                     73: ); end eval-when
                     74:                 
                     75:         
                     76: ;--- the following are macroizations from cmu3.l
                     77: 
                     78: ;(jkf)- ucb list* macro.
                     79: ;
                     80: (defmacro list* (&rest forms)
                     81:          (cond ((null forms) nil)
                     82:                ((null (cdr forms)) (car forms))
                     83:                (t (construct-list* forms))))
                     84: 
                     85: (defun construct-list* (forms)
                     86:        (setq forms (reverse forms))
                     87:        (do ((forms (cddr forms) (cdr forms))
                     88:            (return-form `(cons ,(cadr forms) ,(car forms))
                     89:                         `(cons ,(car forms) ,return-form)))
                     90:           ((null forms) return-form))) 
                     91: 
                     92: (defmacro neq (a b) `(not (eq ,a ,b)))
                     93: 
                     94: 
                     95: (defmacro push (value stack) `(setq ,stack (cons ,value ,stack)))
                     96: 
                     97: 
                     98: 
                     99: 
                    100: 
                    101: ;(jkf) this is actually maknum is the maclisp terminology
                    102: (putd 'munknam (getd 'maknum))
                    103: 
                    104: ; added for CMULisp compatibilty (used by editor etc)
                    105: (putd 'prin1 (getd 'print))
                    106: 
                    107: ;--- selectq :: case statement type construct
                    108: ;
                    109: ;   (selectq <form>
                    110: ;           (<tag1> <expr1> ...)
                    111: ;           (<tag2> <expr2> ...)
                    112: ;               ...
                    113: ;           (<tagn> <exprn> ...)
                    114: ;            (<exprfinal> ...))
                    115: ; <form> is evaluated and then compared with the tagi, if it matches
                    116: ; the expri are evaluated.  If it doesn't match, then <exprfinal> are
                    117: ; evaluated.
                    118: ;
                    119: (def selectq
                    120:    (macro (form)
                    121:          ((lambda (x)
                    122:                   `((lambda (,x)
                    123:                             (cond
                    124:                                  ,@(maplist
                    125:                                         '(lambda (ff)
                    126:                                                  (cond ((null (cdr ff))
                    127:                                                         `(t  ,(car ff)))
                    128:                                                        ((atom (caar ff))
                    129:                                                         `((eq ,x ',(caar ff))
                    130:                                                           . ,(cdar ff)))
                    131:                                                        (t
                    132:                                                             `((memq ,x ',(caar ff))
                    133:                                                               . ,(cdar ff)))))
                    134:                                          (cddr form))))
                    135:                     ,(cadr form)))
                    136:          (gensym 'Z))))
                    137: 
                    138: (defmacro lineread (&optional (x nil)) 
                    139:   `(%lineread ,x))
                    140: 
                    141: 
                    142: 
                    143: (defmacro de (name &rest body)
                    144:    (cond ((status feature complr) `(def ,name (lambda ,@body)))
                    145:         (t `(progn (putd ,name '(lambda ,@body))
                    146:                    (mark!changed ',name)))))
                    147: (defmacro dn (name &rest body)
                    148:    (cond ((status feature complr) `(def ,name (nlambda ,@body)))
                    149:         (t `(progn (putd ,name '(nlambda ,@body))
                    150:                    (mark!changed ',name)))))
                    151: (defmacro dm (name &rest body)
                    152:    (cond ((status feature complr) `(def ,name (macro ,@body)))
                    153:         (t `(progn (putd ,name '(macro ,@body))
                    154:                    (mark!changed ',name)))))
                    155: 
                    156: (eval-when (compile eval load)
                    157:    (or (boundp 'OLD-fcn-def) (setq OLD-fcn-def (getd 'def))))
                    158: 
                    159: (defmacro def (&rest form)
                    160:     (cond ((status feature complr)
                    161:           `(progn 'compile
                    162:                    (eval-when (compile) (putd 'def OLD-fcn-def))
                    163:                    (def ,@form)
                    164:                    (eval-when (compile) (putd 'def CMU-fcn-def))))
                    165:          (t `(progn (putd ',(car form) ',(cadr form))
                    166:                    (mark!changed ',(car form))))))
                    167: 
                    168: (eval-when (compile eval load)
                    169:    (or (boundp 'CMU-fcn-def) (setq CMU-fcn-def (getd 'def))))
                    170: 
                    171: ;--iteration macros
                    172: 
                    173: (def Cdo (macro (l) (expand-do l)))
                    174: 
                    175: (def exists (macro (l) (expand-ex 'some l)))
                    176: 
                    177: (declare (special var))
                    178: 
                    179: (eval-when (compile eval load)
                    180:    
                    181: (def expand-ex
                    182:      (lambda 
                    183:       (fn form)
                    184:       (quote! !
                    185:               fn
                    186:               !
                    187:               (caddr form)
                    188:               (function
                    189:                (lambda 
                    190:                 !
                    191:                 (cond ((atom (cadr form)) (ncons (cadr form)))
                    192:                       (t (cadr form)))
                    193:                 !
                    194:                 (car (setq form (cdddr form)))))
                    195:               !
                    196:               (cond ((cdr form) (list 'function (cadr form)))))))
                    197: ) ; end eval-when
                    198: 
                    199: (def expand-do
                    200:      (lambda 
                    201:       (l)
                    202:       (prog (label var init incr limit part)
                    203:             (cond
                    204:              ((setq part (memq 'for l))
                    205:               (setq var (cadr part))
                    206:               (setq l (append (ldiff l part) (cddr part)))))
                    207:             (cond
                    208:              ((setq part (exists w l (memq w '(gets = _ :=))))
                    209:               (setq init (cadr part))
                    210:               (setq l (append (ldiff l part) (cddr part)))))
                    211:             (cond
                    212:              ((setq part (exists w l (memq w '(step by))))
                    213:               (setq incr (cadr part))
                    214:               (setq l (append (ldiff l part) (cddr part)))))
                    215:             (cond
                    216:              ((setq part (memq 'to l))
                    217:               (setq limit (cadr part))
                    218:               (setq l (append (ldiff l part) (cddr part)))))
                    219:             (return
                    220:              (quote! prog
                    221:                      !
                    222:                      (cond (var (ncons var)))
                    223:                      !!
                    224:                      (cond
                    225:                       (var
                    226:                        (ncons
                    227:                         (list 'setq var (cond (init) (t 1))))))
                    228:                      !
                    229:                      (setq label (gensym))
                    230:                      !!
                    231:                      (mapcan (function
                    232:                               (lambda 
                    233:                                (exp)
                    234:                                (cond ((eq part 'while)
                    235:                                       (setq part nil)
                    236:                                       (quote!
                    237:                                        (cond
                    238:                                         ((not ! exp) (return nil)))))
                    239:                                      ((eq part 'until)
                    240:                                       (setq part nil)
                    241:                                       (quote!
                    242:                                        (cond (! exp (return nil)))))
                    243:                                      ((memq (setq part exp)
                    244:                                             '(while until do Cdo))
                    245:                                       nil)
                    246:                                      (t (ncons exp)))))
                    247:                              l)
                    248:                      !!
                    249:                      (cond
                    250:                       (var
                    251:                        (quote!
                    252:                         (setq ! var (+ ! var ! (cond (incr) (t 1)))))))
                    253:                      !!
                    254:                      (cond
                    255:                       ((and var limit)
                    256:                        (quote! (cond ((> ! var ! limit) (return nil))))))
                    257:                      (go ! label))))))
                    258: 
                    259: 
                    260: (def expand-fe
                    261:      (lambda 
                    262:       (form)
                    263:       (prog (vars body)
                    264:             (return
                    265:              (cons (cond ((memq (cadr form)
                    266:                                 (quote
                    267:                                  (map mapc
                    268:                                       mapcan
                    269:                                       mapcar
                    270:                                       mapcon
                    271:                                       mapconc
                    272:                                       maplist)))
                    273:                           (setq form (cdr form))
                    274:                           (car form))
                    275:                          (t 'mapc))
                    276:                    (progn (setq vars (cadr form))
                    277:                           (cond ((atom vars) (setq vars (list vars))))
                    278:                           (cons (cons 'function
                    279:                                       (ncons
                    280:                                        (cons 'lambda
                    281:                                              (cons vars
                    282:                                                    (setq body
                    283:                                                          (Cnth (cdddr
                    284:                                                                 form)
                    285:                                                                (length
                    286:                                                                 vars)))))))
                    287:                                 (ldiff (cddr form) body))))))))
                    288: (def expand-set-of
                    289:      (lambda 
                    290:       (form)
                    291:       (prog (vars body)
                    292:             (setq vars (cadr form))
                    293:             (cond ((atom vars) (setq vars (list vars))))
                    294:             (setq form (cddr form))
                    295:             (return
                    296:              (quote! mapcan
                    297:                      (function
                    298:                       (lambda 
                    299:                        !
                    300:                        vars
                    301:                        (cond
                    302:                         (! (car
                    303:                             (setq body (Cnth (cdr form) (length vars))))
                    304:                            (list ! (car vars))))))
                    305:                      !!
                    306:                      (ldiff form body))))))
                    307: 
                    308: (dv filelst nil)
                    309: 
                    310: (def for (macro (l) (expand-do l)))
                    311: 
                    312: (def for-each (macro (l) (expand-fe l)))
                    313: 
                    314: (def forall (macro (l) (expand-ex 'every l)))
                    315: 
                    316: (def set-of (macro (l) (expand-set-of l)))
                    317: 
                    318: (def ty (macro (f) (append '(exec cat) (cdr f))))
                    319: 
                    320: (def until (macro (l) (expand-do l)))
                    321: 
                    322: (def while (macro (l) (expand-do l)))
                    323: 
                    324: (putprop 'cmumacs t 'version)

unix.superglobalmegacorp.com

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