Annotation of 3BSD/cmd/liszt/complrc.l, revision 1.1

1.1     ! root        1: ;--- file : complrc.l
        !             2: (include "compmacs.l")
        !             3: 
        !             4: (declare (special w-vars w-labs w-ret w-name w-bv w-atmt cm-alv v-cnt))
        !             5: (def $pr$ (macro (x) `(patom ,(cadr x) compout)))
        !             6: 
        !             7: (def put 
        !             8:   (macro (x)
        !             9:         ((lambda (atm prp arg)
        !            10:                  `(progn (putprop ,atm ,arg ,prp) ,atm))
        !            11:          (cadr x) (caddr x) (cadddr x))))
        !            12: 
        !            13: (def f-if 
        !            14:   (lambda (v-l v-r v-j v-t) 
        !            15:          (cond ((eq (caar v-l) 't) 
        !            16:                 (cond ((null (cdar v-l)) (f-exp t v-r v-t)) 
        !            17:                       (t (f-seq (cdar v-l) v-r v-t)))) 
        !            18:                (t (prog (v-tr v-i v-dv) 
        !            19:                         (setq v-tr (f-reg nil))
        !            20:                         (setq v-dv 'amb)
        !            21:                         (cond ((null (cdr v-l)) 
        !            22:                                (setq v-tr v-r) 
        !            23:                                (cond ((null (cdar v-l)) (go loop2))) 
        !            24:                                (setq v-dv nil) 
        !            25:                                (setq v-i (cadr v-j))) 
        !            26:                               ((null (cdar v-l)) 
        !            27:                                (setq v-tr v-r) 
        !            28:                                (setq v-t (f-if (cdr v-l) v-r v-j v-t)) 
        !            29:                                (setq v-t (f-addi (list 'true (cadr v-j) t)
        !            30:                                                  v-t))
        !            31:                                (go loop1)) 
        !            32:                               (t (setq v-t (f-leap (f-if (cdr v-l)
        !            33:                                                          v-r 
        !            34:                                                          v-j 
        !            35:                                                          v-t))) 
        !            36:                                  (setq v-t (f-addi v-j v-t)) 
        !            37:                                  (setq v-i (cadr s-inst)))) 
        !            38:                         (setq v-t (f-seq (cdar v-l) v-r v-t)) 
        !            39:                         (setq v-t (f-addi (list 'false v-i v-dv) v-t)) 
        !            40:                 loop1 
        !            41:                         (setq v-t (f-addi (list 'minus (f-use v-tr) nil) v-t)) 
        !            42:                 loop2 
        !            43:                         (return (f-exp (caar v-l) v-tr v-t))))))) 
        !            44: ;--- f-seqp - v-l : sequence of s-expressions and labels to evaluate
        !            45: ;          - v-r : psreg in which to store the final result
        !            46: ;          - v-t : tail.
        !            47: ;      This will do the top level of prog bodies 
        !            48: ;
        !            49: (def f-seqp 
        !            50:   (lambda (v-l v-r v-t) 
        !            51:          (do ((l (reverse v-l) (cdr l))
        !            52:               (newreg v-r)
        !            53:               (reg v-r newreg))
        !            54:              ((null l) v-t)
        !            55:              (cond ((symbolp (car l))
        !            56:                     (setq v-t (f-labl v-t (car l))))
        !            57:                    (t (setq v-t (f-exp (car l) reg v-t))
        !            58:                       (setq newreg (Gensym nil)))))))
        !            59: 
        !            60: ;--- f-seq - v-l : sequence of s-expressions to evaluate
        !            61: ;         - v-r : psreg in which to store the final result
        !            62: ;         - v-t : tail
        !            63: ;
        !            64: ;      This generates intermediate codes to calculate the s-expressions
        !            65: ;      in v-l.  This does not look for labels.
        !            66: ;
        !            67: (def f-seq
        !            68:   (lambda (v-l v-r v-t)
        !            69:          (do ((l (reverse v-l) (cdr l))
        !            70:               (reg v-r (Gensym nil)))
        !            71:              ((null l) v-t)
        !            72:              (setq v-t (f-exp (car l) reg v-t)))))
        !            73: 
        !            74: ;--- f-pusha - v-l : list of forms to evaluate and push on stack
        !            75: ;           - v-r : register to place result of last expr in 
        !            76: ;           - v-t : tail
        !            77: ;      emits code to to evaluate and push forms on the stack.
        !            78: (def f-pusha
        !            79:   (lambda (v-l v-r v-t)
        !            80:          (cond ((null v-l) v-t) 
        !            81:                (t (do ((ll (reverse v-l) (cdr ll)) 
        !            82:                        (reg v-r (Gensym nil))
        !            83:                        (res v-t
        !            84:                             (f-exp (car ll) 
        !            85:                                    reg
        !            86:                                    (f-addi `(push ,(f-use reg)) res))))
        !            87:                       ((null ll) res))))))
        !            88: 
        !            89: ;--- f-iter - v-e : list of expression to evaluate
        !            90: ;          - v-v : list of variables those expressions will be bound to
        !            91: ;      This checks of the given expressions can be bound to the given
        !            92: ;      variables with no conflicts.  This is determining if tail
        !            93: ;      merging is possible were we replace recursion by iteration.
        !            94: ;
        !            95: (def f-iter
        !            96:   (lambda (v-e v-v) 
        !            97:          (prog (v-y w-vars) 
        !            98: 
        !            99:          loop 
        !           100:                (cond ((null v-e) (return t)) 
        !           101:                      ((null v-v) (go bad)) 
        !           102:                      ((ifflag (setq v-y (car v-v)) x-spec) (go bad)) 
        !           103:                      ((equal (car v-e) v-y) (go usable))
        !           104:                      (t (go check)))
        !           105:          next 
        !           106:                (setq w-vars (cons v-y w-vars)) 
        !           107:          usable 
        !           108:                (setq v-e (cdr v-e)) 
        !           109:                (setq v-v (cdr v-v)) 
        !           110:                (go loop) 
        !           111:          check 
        !           112:                (cond ((f-nice (car v-e)) (go next))) 
        !           113:          bad 
        !           114:                (return nil)))) 
        !           115: 
        !           116: (def f-nice 
        !           117:   (lambda (v-e)
        !           118:          (cond ((atom v-e) (not (member v-e w-vars))) 
        !           119:                ((atom (car v-e)) 
        !           120:                 (cond ((eq (car v-e) 'quote) t) 
        !           121:                       ((ifflag (car v-e) x-dont) nil) 
        !           122:                       (t (f-all v-e 'f-nice)))) 
        !           123:                (t (f-all v-e 'f-nice))))) 
        !           124: 
        !           125: ;--- f-all - v-l : list
        !           126: ;         - v-f : function
        !           127: ;      mapc function v-f over v-l as long as the result is non nil
        !           128: ;
        !           129: (def f-all 
        !           130:   (lambda (v-l v-f) 
        !           131:          (cond ((null v-l) t) 
        !           132:                ((funcall v-f (car v-l)) (f-all (cdr v-l) v-f)) 
        !           133:                (t nil)))) 
        !           134: 
        !           135: (def f-make 
        !           136:   (lambda (v-r v-v) 
        !           137:          (put v-r x-reg v-v))) 
        !           138: 
        !           139: ;--- f-leap - v-t : tail
        !           140: ;      We generate and place in global variable s-inst an itermediate
        !           141: ;      instructin which will jump to the current top location in v-t.
        !           142: ;      If there is not a label on top of v-t, one is added.
        !           143: ;
        !           144: (def f-leap 
        !           145:   (lambda (v-t) 
        !           146:          (cond ((not (setq s-inst (get (caar v-t) x-leap))) 
        !           147:                 (setq v-t (f-labl v-t nil)) 
        !           148:                 (setq s-inst 'go))) 
        !           149:          (setq s-inst (list s-inst (cadar v-t))) 
        !           150:          v-t)) 
        !           151: 
        !           152: ;--- f-labl - v-t : tail
        !           153: ;          - v-l : real label or nil
        !           154: ;      We insure that there is a label on top of v-t. If not we
        !           155: ;      create one. If we are given a label, we associate it with
        !           156: ;      a created label. 
        !           157: ;      Labels in v-t are all gensymed and the association is all
        !           158: ;      on the property list of the value of w-labs.
        !           159: ; Errors: duplicate labels
        !           160: ;
        !           161: (def f-labl 
        !           162:   (lambda (v-t v-l) 
        !           163:          (prog (v-i) 
        !           164:                (cond ((eq (caar v-t) 'label) 
        !           165:                       (cond (v-l (cond ((setq v-i (get w-labs v-l)))
        !           166:                                        (t (put w-labs v-l (cadar v-t))
        !           167:                                           (return v-t))))
        !           168:                             (t (return v-t)))) 
        !           169:                      
        !           170:                      ((null v-l) (setq v-i (Gensym nil))) 
        !           171:                      ((setq v-i (get w-labs v-l))) 
        !           172:                      (t (put w-labs v-l (setq v-i (Gensym nil))))) 
        !           173:                (return (f-addi (list 'label v-i) v-t))))) 
        !           174: 
        !           175: (def f-test 
        !           176:   (lambda (v-t) 
        !           177:          (and (eq (caar v-t) 'minus) 
        !           178:               (null (caddar v-t))))) 
        !           179: 
        !           180: (def f-vble 
        !           181:   (lambda (v-v v-r) 
        !           182:          (f-use v-r) 
        !           183:          (cond ((not (symbolp v-v)) v-v) 
        !           184:                ((null v-v) nil)
        !           185:                ((f-con v-v) v-v) 
        !           186:                ((ifflag v-v x-spec) v-v) 
        !           187:                ((member v-v w-vars) v-v) 
        !           188:                (t (setq k-free (cons v-v k-free)) 
        !           189:                   (flag v-v x-spec))))) 
        !           190: 
        !           191: (def f-addi 
        !           192:   (lambda (v-i v-t) 
        !           193:          (prog (v-o) 
        !           194:                (cond ((not (setq v-o (get (car v-i) x-opt))) (go normal)) 
        !           195:                      ((setq v-o (funcall v-o  v-i v-t)) (return v-o)))
        !           196:           normal 
        !           197:                (return (cons v-i v-t))))) 
        !           198: 
        !           199: (def f-reg 
        !           200:   (lambda (v-f) 
        !           201:          (cond ((numberp v-f) (put (Gensym nil) x-reg v-f)) 
        !           202:                (v-f (flag (Gensym nil) v-f)) 
        !           203:                (t (Gensym nil))))) 
        !           204: 
        !           205: (def f-con 
        !           206:   (lambda (v-v) 
        !           207:          (cond ((ifflag v-v x-spec) nil)
        !           208:                (t (ifflag v-v x-con)))))
        !           209: 
        !           210: (def f-one 
        !           211:   (lambda (v-e) 
        !           212:          (or (atom v-e) 
        !           213:              (eq (car v-e) 'quote)))) 
        !           214: 
        !           215: (def f-swap 
        !           216:   (lambda (v-t) 
        !           217:          (cond ((eq (caar v-t) 'get) (f-swap (cdr v-t))) 
        !           218:                (t (rplaca (car v-t) 
        !           219:                           (cond ((eq (caar v-t) 'true) 'false) 
        !           220:                                 (t 'true))))) 
        !           221:          v-t)) 
        !           222: 
        !           223: (def f-xval 
        !           224:   (lambda (v-t v-r) 
        !           225:          (cond ((or (eq (caar v-t) 'get) 
        !           226:                     (eq (caddar v-t) 'amb)) v-t) 
        !           227:                (t (f-addi (list 'get (f-use v-r) (caddar v-t)) v-t))))) 
        !           228: 
        !           229: ;--- f-use - v-r :  psreg whose value is being used
        !           230: ;      we keep track of the number of times the value of a register is
        !           231: ;      used,  the count is kept under the indicator x-count in the
        !           232: ;      psreg's property list.  the count starts at nil, goes to `used'
        !           233: ;      and then to `force'.  Once the count goes to `force' all gets
        !           234: ;      must be done. when the count is used get should look to see
        !           235: ;      if the following intermediate code instruction is the one
        !           236: ;      using the register and in that case it can merge with that
        !           237: ;      instruction
        !           238: ;
        !           239: (def f-use
        !           240:   (lambda (v-r)
        !           241:          ((lambda (curv)
        !           242:                   (cond (curv (cond ((not (eq curv 'force)) 
        !           243:                                      (putprop v-r 'force 'x-count))))
        !           244:                         (t (putprop v-r 'used 'x-count)))
        !           245:                   v-r)
        !           246:           (get v-r 'x-count))))
        !           247: 
        !           248: 
        !           249: (def f-chop 
        !           250:   (lambda (v-t) 
        !           251:          (cond ((or (eq (caar v-t) 'label) 
        !           252:                     (eq (caar v-t) 'end)) v-t) 
        !           253:                (t (f-chop (cdr v-t)))))) 
        !           254: 
        !           255: (def f-tfo 
        !           256:   (lambda (v-i v-t) 
        !           257:          (cond ((not (f-like v-t '(go label))) nil) 
        !           258:                ((not (equal (cadr v-i) (cadadr v-t))) nil) 
        !           259:                (t (rplaca (cdr v-i) (cadar v-t)) 
        !           260:                   (f-swap (rplaca v-t v-i)))))) 
        !           261: 
        !           262: (def f-like 
        !           263:   (lambda (v-t v-p) 
        !           264:          (cond ((null v-p) t) 
        !           265:                ((null v-t) nil) 
        !           266:                ((equal (caar v-t) (car v-p)) (f-like (cdr v-t) (cdr v-p))) 
        !           267:                (t nil)))) 
        !           268: 
        !           269: (def f-aor 
        !           270:   (lambda (v-l v-e v-r v-t) 
        !           271:          (cond ((null v-l) 
        !           272:                 (f-addi (list 'get (f-use v-r) (eq v-e 'and)) v-t)) 
        !           273:                (t (prog (v-j v-dv v-tr v-tr2) 
        !           274:                         (setq v-dv (eq v-e 'or))
        !           275:                         (setq v-tr v-r)
        !           276:                         (setq v-tr2 v-r)
        !           277:                         (setq v-e 
        !           278:                               (cond ((eq v-e 'and) 'false) 
        !           279:                                     (t 'true))) 
        !           280:                         (setq v-l (reverse v-l)) 
        !           281:                         (cond ((null (cdr v-l)) (go loop)) 
        !           282:                               ((and (f-test v-t) 
        !           283:                                     (not (eq (caadr v-t) 'get))) 
        !           284:                                (cond ((eq (caddadr v-t) 'amb) 
        !           285:                                       (setq v-dv 'amb) 
        !           286:                                       (setq v-tr2 (f-reg nil))) 
        !           287:                                      ((not (equal (caddadr v-t) v-dv)) 
        !           288:                                       (setq v-dv 'amb))) 
        !           289:                                (cond ((equal (caadr v-t) v-e) 
        !           290:                                       (setq v-j (cadadr v-t)) 
        !           291:                                       (go loop))) 
        !           292:                                (rplacd (cdr v-t) (f-leap (cddr v-t)))) 
        !           293:                               (t (setq v-t (f-leap v-t)))) 
        !           294:                         (setq v-j (cadr s-inst)) 
        !           295:                  loop 
        !           296:                         (setq v-t (f-exp (car v-l) v-tr v-t)) 
        !           297:                         (setq v-tr v-tr2) 
        !           298:                         (cond ((null (setq v-l (cdr v-l))) (return v-t))) 
        !           299:                         (setq v-t (f-addi (list v-e v-j v-dv) v-t)) 
        !           300:                         (setq v-t (f-addi (list 'minus (f-use v-tr) nil) v-t)) 
        !           301:                         (go loop)))))) 
        !           302: 
        !           303: (def f-repl 
        !           304:   (lambda (v-e) 
        !           305:          (cons (ucar (car v-e)) (cdr v-e)))) 
        !           306: 
        !           307: ;this seems out of date, must change to mapconvert
        !           308: (def f-domap
        !           309:   (lambda (v-e) 
        !           310:          (prog (v-x) 
        !           311:                (cond ((setq v-x (f-chkf (cadr v-e) 4)) 
        !           312:                       (return (list (car v-e) 
        !           313:                                     (list 'quote v-x)
        !           314:                                     (caddr v-e)))) 
        !           315:                      (t (return v-e))))))
        !           316: 
        !           317: 
        !           318: ;--- mapconvert - access : function to access parts of lists
        !           319: ;              - join   : function to join results
        !           320: ;              - resu   : function to apply to result
        !           321: ;              - form   : mapping form
        !           322: ;      This function converts maps to an equivalent do form.
        !           323: ;
        !           324: (def mapconvert
        !           325:   (lambda (access join resu form )
        !           326:          (prog (vrbls finvar acc accform compform tmp)
        !           327: 
        !           328:                (setq finvar (Gensym 'X)   ; holds result
        !           329: 
        !           330:                      vrbls (maplist '(lambda (arg)
        !           331:                                        ((lambda (temp)
        !           332:                                            (cond ((or resu (cdr arg))
        !           333:                                                   `(,temp ,(car arg)
        !           334:                                                           (cdr ,temp)))
        !           335:                                                  (t `(,temp 
        !           336:                                                       (setq ,finvar ,(car arg))
        !           337:                                                       (cdr ,temp)))))
        !           338:                                         (Gensym 'X)))
        !           339:                                    (cdr form))
        !           340: 
        !           341: 
        !           342:                      acc (mapcar '(lambda (tem)
        !           343:                                           (cond (access `(,access ,(car tem)))
        !           344:                                                 (t (car tem))))
        !           345:                                  vrbls)
        !           346: 
        !           347:                      accform (cond ((or (atom (setq tmp (car form)))
        !           348:                                         (null (setq tmp (cmacroexpand tmp)))
        !           349:                                         (not (member (car tmp) '(quote function))))
        !           350:                                     `(funcall ,tmp ,@acc))
        !           351:                                    (t `(,(cadr tmp) ,@acc))))
        !           352:                (return
        !           353:                 `((lambda (,finvar)
        !           354:                    (do ( ,@vrbls)
        !           355:                        ((null ,(caar vrbls)))
        !           356:                        ,(cond (join `(setq ,finvar (,join ,accform ,finvar)))
        !           357:                               (t accform)))
        !           358:                    ,(cond (resu `(,resu ,finvar))
        !           359:                           (t finvar)))
        !           360:                   nil )))))
        !           361: (putprop 'mapc 'f-mapc 'x-spfm)
        !           362: (def f-mapc
        !           363:   (lambda (v-e)
        !           364:          (mapconvert 'car nil nil (cdr v-e))))
        !           365: 
        !           366: (putprop 'mapcar 'f-mapcar 'x-spfm)
        !           367: (def f-mapcar
        !           368:   (lambda (v-e)
        !           369:          (mapconvert 'car 'cons 'reverse (cdr v-e))))
        !           370: 
        !           371: (putprop 'map 'f-map 'x-spfm)
        !           372: (def f-map
        !           373:   (lambda (v-e)
        !           374:          (mapconvert nil nil nil (cdr v-e))))
        !           375: 
        !           376: 
        !           377: (putprop 'maplist 'f-maplist 'x-spfm)
        !           378: (def f-maplist
        !           379:   (lambda (v-e)
        !           380:          (mapconvert nil 'cons 'reverse (cdr v-e))))
        !           381: 
        !           382: 
        !           383: 
        !           384: 
        !           385: (def f-initv
        !           386:   (lambda (v-l)
        !           387:          (mapcar 'car (car v-l))))
        !           388: 
        !           389: (def f-inits
        !           390:   (lambda (v-l)
        !           391:          (mapcar 'cadr (car v-l))))
        !           392: 
        !           393: (def f-repv
        !           394:   (lambda (v-l)
        !           395:          (prog (v-x)
        !           396:                (setq v-l (car v-l))
        !           397:           lp 
        !           398:                (cond ((null v-l) (return (reverse v-x))))
        !           399:                (cond ((cddar v-l) (setq v-x (cons (caar v-l) v-x))))
        !           400:                (setq v-l (cdr v-l))
        !           401:                (go lp))))
        !           402: 
        !           403: (def f-reps
        !           404:   (lambda (v-l)
        !           405:          (prog (v-x v-y)
        !           406:                (setq v-l (car v-l))
        !           407:           lp 
        !           408:                (cond ((null v-l) (return (reverse v-x))))
        !           409:                (cond ((cddar v-l) 
        !           410:                       (setq v-y (caddar v-l)) (setq v-x (cons v-y v-x))))
        !           411:                (setq v-l (cdr v-l))
        !           412:                (go lp))))
        !           413: 
        !           414: (def f-endtest
        !           415:   (lambda (v-l)
        !           416:          (caadr v-l)))
        !           417: 
        !           418: (def f-endbody
        !           419:   (lambda (v-l)
        !           420:          (cdadr v-l)))
        !           421: 
        !           422: (def f-dobody
        !           423:   (lambda (v-l)
        !           424:          (cddr v-l)))
        !           425: 
        !           426: 
        !           427: (putprop 'do 'f-do 'x-spf)
        !           428: 
        !           429: (def f-do
        !           430:   (lambda (v-l v-r v-t)
        !           431:     (prog (v-init v-initv v-rep v-repv v-loop v-outl v-retl)
        !           432:        (cond ((and (car v-l) (atom (car v-l))) ; look for old do
        !           433:               (setq v-l (olddo-to-newdo v-l))))
        !           434:        (setq v-initv (f-initv v-l)
        !           435:              v-init (f-inits v-l)
        !           436:              v-repv (f-repv v-l)
        !           437:              v-rep (f-reps v-l)
        !           438:              v-retl (Gensym nil)
        !           439:              v-loop (Gensym nil)
        !           440:              v-outl (Gensym nil))
        !           441:        (w-save)
        !           442:        (return
        !           443:         (f-pusha v-init v-r
        !           444:            (prog (w-ret w-labs tmp)
        !           445:                  (setq w-ret `(,v-r . (go ,v-retl)))
        !           446:                  (setq w-labs (Gensym nil))
        !           447:                  (setq tmp 
        !           448:                   `((begin ,(length v-initv))
        !           449:                     ,@(mapcar '(lambda (arg) (setq w-locs
        !           450:                                                           (cons arg w-locs))
        !           451:                                             `(bind ,arg))
        !           452:                               v-initv)
        !           453:                     (label ,v-loop)
        !           454:                     ,@(f-exp (f-endtest v-l) v-r
        !           455:                              `((minus ,v-r nil)
        !           456:                                (true ,v-outl nil)
        !           457:                                ,@(f-seqp (f-dobody v-l) v-r
        !           458:                                          (f-pusha v-rep v-r
        !           459:                                              `((dopop ,v-repv)
        !           460:                                                (go ,v-loop)
        !           461:                                                (label ,v-outl)
        !           462:                                                ,@(f-seq (f-endbody v-l) v-r
        !           463:                                                         `((end ,v-retl)
        !           464:                                                           ,@v-t)))))))))
        !           465:                  (w-unsave)
        !           466:                  (return tmp)))))))
        !           467: 
        !           468: (def olddo-to-newdo
        !           469:   (lambda (v-l)
        !           470:          `(((,(car v-l) ,(cadr v-l) ,(caddr v-l)))
        !           471:            (,(cadddr v-l) nil)
        !           472:            ,@(cddddr v-l))))
        !           473: 
        !           474: (putprop 'cond 'f-cond 'x-spf)
        !           475: 
        !           476: (def f-cond    
        !           477:   (lambda (v-l v-r v-t) 
        !           478:          (setq v-t (f-leap v-t)) 
        !           479:          (f-if v-l v-r s-inst v-t))) 
        !           480: 
        !           481: (putprop 'quote 'f-quote 'x-spf)
        !           482: 
        !           483: (def f-quote 
        !           484:   (lambda (v-l v-r v-t) 
        !           485:         (f-addi (list 'get v-r (cons 'quote v-l)) v-t))) 
        !           486: 
        !           487: (putprop 'prog 'f-prog 'x-spf)
        !           488: 
        !           489: 
        !           490: 
        !           491: 
        !           492: (putprop 'setq 'f-setq 'x-spf)
        !           493: 
        !           494: (def f-setq 
        !           495:   (lambda (v-l v-r v-t)
        !           496:          (cond ((null (car v-l)) v-t))
        !           497:          (do ((ll (reverse v-l) (cddr ll))
        !           498:               (reg v-r (Gensym nil)))
        !           499:              ((null ll) v-t)
        !           500:              (setq v-t (f-exp (car ll)
        !           501:                               reg
        !           502:                               `((set ,(f-use reg) ,(g-specialchk (cadr ll)))
        !           503:                                 ,@v-t))))))
        !           504: 
        !           505: 
        !           506: (putprop 'rplaca 'f-rplaca 'x-spf)
        !           507: 
        !           508: 
        !           509: (def f-rplaca 
        !           510:   (lambda (v-l v-r v-t)
        !           511:          (cond ((f-one (cadr v-l))
        !           512:                 (f-exp (car v-l) 
        !           513:                        v-r
        !           514:                        (f-exp (cadr v-l) 
        !           515:                               (setq v-l (Gensym nil))
        !           516:                               (f-addi (list 'seta (f-use v-r) (f-use v-l))
        !           517:                                       v-t))))
        !           518:                (t (f-pusha v-l 
        !           519:                            (Gensym nil)
        !           520:                            (f-addi (list 'setas v-r) v-t))))))
        !           521: 
        !           522: (putprop 'rplacd 'f-rplacd 'x-spf)
        !           523: 
        !           524: 
        !           525: (def f-rplacd 
        !           526:   (lambda (v-l v-r v-t)
        !           527:          (cond ((f-one (cadr v-l))
        !           528:                 (f-exp (car v-l)
        !           529:                        v-r
        !           530:                        (f-exp (cadr v-l)
        !           531:                               (setq v-l (Gensym nil))
        !           532:                               (f-addi (list 'setd (f-use v-r) (f-use v-l)) v-t))))
        !           533:                (t (f-pusha v-l 
        !           534:                            (Gensym nil)
        !           535:                            (f-addi (list 'setds (f-use v-r)) v-t))))))
        !           536: 
        !           537: (putprop 'go 'f-go 'x-spf)
        !           538: 
        !           539: ;--- f-go - v-l : label to go to
        !           540: ;        - v-r : not used
        !           541: ;        - v-t : tail
        !           542: ; We allow non local go to's, however the goto must go no further than the
        !           543: ; first inclosing prog.
        !           544: ; f-go works by finding the w-labs associated with the first enclosing prog,
        !           545: ; and keeping track of the number of binding levels which must be traversed
        !           546: ; to get to that prog.o
        !           547: ; when it finds the correct w-labs, it checks if this label has been seen yet,
        !           548: ; if not iit assigns it a gensymed symbol.  
        !           549: ; if a binding level must be traversed, we eimit
        !           550: ;      (unbind n)      n is number of binding levels to traverse, 
        !           551: ;                      0 means current level only.
        !           552: ;      (go gensymedlabl)
        !           553: ;
        !           554: ; if this is a local goto only the (go gensymedlabl) will be emitted.
        !           555: ;
        !           556: (def f-go 
        !           557:   (lambda (v-l v-r v-t) 
        !           558:          (prog (use-labs levels)
        !           559:                (setq v-l (car v-l)) 
        !           560:                (setq use-labs
        !           561:                      (cond (w-ret w-labs)
        !           562:                            (t (do ((ll w-save (cdr ll))
        !           563:                                    (count 0 (add1 count)))
        !           564:                                   ((null ll)
        !           565:                                    (comp-err " go not within prog"))
        !           566:                                   (cond ((caar ll)
        !           567:                                          (setq levels count)
        !           568:                                          (comp-warn " non-local go used")
        !           569:                                          (return (cadar ll))))))))
        !           570:                
        !           571:                (cond ((not (setq v-r (get use-labs v-l))) 
        !           572:                       (put use-labs v-l (setq v-r (Gensym nil))))) 
        !           573:                (setq v-t (f-addi (list 'go v-r) v-t))
        !           574:                (cond (levels (setq v-t (f-addi `(unbind ,levels) v-t))))
        !           575:                (return v-t)))) 
        !           576: 
        !           577: (putprop 'lambda 'f-lambda 'x-spf)
        !           578: 
        !           579: ;--- f-lambda - ?? how is this routine called, certainly this isnt the
        !           580: ;              same as ((lambda (n) form)  arg)
        !           581: ;
        !           582: 
        !           583: (putprop 'and 'f-and 'x-spf)
        !           584: 
        !           585: (def f-and 
        !           586:   (lambda (v-l v-r v-t) 
        !           587:         (f-aor v-l 'and v-r v-t))) 
        !           588: 
        !           589: (putprop 'or 'f-or 'x-spf)
        !           590: 
        !           591: (def f-or 
        !           592:   (lambda (v-l v-r v-t) 
        !           593:         (f-aor v-l 'or v-r v-t))) 
        !           594: 
        !           595: 
        !           596: 
        !           597: (putprop 'prog2 'prog2toprog 'x-spfm)
        !           598: 
        !           599: 
        !           600: ;--- prog2toprog - v-e : prog2 expression
        !           601: ; we convert this (prog2 a b c d e f) to
        !           602: ;      (progn a ((lambda (newsim) c d e f newsim) b))
        !           603: ; simple enough.
        !           604: ;
        !           605: (def prog2toprog
        !           606:   (lambda (v-e)
        !           607:          ((lambda (newsim)
        !           608:                   `(progn ,(cadr v-e)
        !           609:                           ((lambda (,newsim)
        !           610:                                    ,@(cdddr v-e)
        !           611:                                    ,newsim)
        !           612:                            ,(caddr v-e))))
        !           613:           (Gensym nil))))
        !           614: 
        !           615: 
        !           616: (putprop 'progn 'f-seq 'x-spf)
        !           617: 
        !           618: (putprop 'return 'f-return 'x-spfn)
        !           619: 
        !           620: ;--- f-return - v-l : arg to return, may be nil meaning return nil
        !           621: ;            - v-r : psreg in which to store result
        !           622: ;            - v-t : tail
        !           623: ;      this handles the return statement.  While returns should
        !           624: ;      occur in progs, this allows for a return inside a context
        !           625: ;      which is inside a prog (or do).  If this is a simple return
        !           626: ;      from prog or do, we have:
        !           627: ;              ... code to place to be returned val in v-r
        !           628: ;            (go retlb)        jump to label at end of prog body
        !           629: ;                              but before special unbinding
        !           630: ;      for non local cases we have
        !           631: ;              ...   code to place value to be returned into v-r
        !           632: ;            (unwind levels)  where is levels is the number of enclosing
        !           633: ;                    contexts (which begin with a (begin xx)) to return
        !           634: ;                    from.
        !           635: ;            (go retlb)        then go to the return spot.
        !           636: ;
        !           637: (def f-return
        !           638:   (lambda (v-l v-r v-t) 
        !           639:          (prog (use-ret levels)
        !           640:                (setq use-ret 
        !           641:                      (cond (w-ret)
        !           642:                            (t (do ((ll w-save (cdr ll))
        !           643:                                    (count 0 (add1 count)))
        !           644:                                   ((null ll) 
        !           645:                                    (comp-err " return not within a prog"))
        !           646:                                   (cond ((caar ll)
        !           647:                                          (setq levels count)
        !           648:                                          (comp-warn " non local return used")
        !           649:                                          (return (caar ll))))))))
        !           650:                
        !           651:                (setq v-t (f-addi (cdr use-ret) v-t)) 
        !           652:                (cond (levels (setq v-t (f-addi `(unbind ,levels) v-t))))
        !           653:                (return (f-exp (and v-l (car v-l)) (f-use (car use-ret)) v-t))))) 
        !           654: 
        !           655: (putprop 'null 'f-null 'x-spfn)
        !           656: 
        !           657: (def f-null 
        !           658:   (lambda (v-l v-r v-t) 
        !           659:          (cond ((f-test v-t) 
        !           660:                 (rplaca (cdar (rplacd v-t (f-xval (f-swap (cdr v-t)) v-r)))
        !           661:                         (f-use (setq v-r (Gensym nil))))
        !           662:                 (f-exp (car v-l) v-r v-t)))))
        !           663: 
        !           664: (putprop 'not 'f-null 'x-spfn)
        !           665: 
        !           666: 
        !           667: (def f-type 
        !           668:   (lambda (v-l v-r v-t v-bits) 
        !           669:          (cond ((f-test v-t) 
        !           670:                 (setq v-t (f-xval (cdr v-t) v-r))
        !           671:                 (f-exp (car v-l) 
        !           672:                        (setq v-r (Gensym nil))
        !           673:                        (f-addi (list 'getype (f-use v-r) v-bits) v-t)))))) 
        !           674: 
        !           675: (putprop 'atom 'f-atom 'x-spfn)
        !           676: 
        !           677: (def f-atom 
        !           678:   (lambda (v-l v-r v-t)
        !           679:          (f-type v-l v-r v-t '(0 1 2 4 5 6 7 9 10))))
        !           680: 
        !           681: (putprop 'numberp 'f-numberp 'x-spfn)
        !           682: 
        !           683: (def f-numberp 
        !           684:   (lambda (v-l v-r v-t) 
        !           685:          (f-type v-l v-r v-t '(2 4 9))))
        !           686: 
        !           687: (putprop 'symbolp 'f-symbolp 'x-spfn)
        !           688: 
        !           689: (def f-symbolp 
        !           690:   (lambda (v-l v-r v-t)
        !           691:        (f-type v-l v-r v-t 1)))
        !           692: 
        !           693: (putprop 'dtpr 'f-dtpr 'x-spfn)
        !           694: 
        !           695: (def f-dtpr 
        !           696:   (lambda (v-l v-r v-t)
        !           697:          (f-type v-l v-r v-t 3)))
        !           698: 
        !           699: (putprop 'bcdp 'f-bcdp 'x-spfn)
        !           700: 
        !           701: (def f-bcdp 
        !           702:   (lambda (v-l v-r v-t)
        !           703:          (f-type v-l v-r v-t 5)))
        !           704: 
        !           705: (putprop 'stringp 'f-stringp 'x-spfn)
        !           706: 
        !           707: (def f-stringp 
        !           708:   (lambda (v-l v-r v-t)
        !           709:          (f-type v-l v-r v-t 0)))
        !           710: 
        !           711: (putprop 'type 'f-ty 'x-spfn)
        !           712: 
        !           713: (def f-ty 
        !           714:   (lambda (v-l v-r v-t)
        !           715:          (f-exp (car v-l) 
        !           716:                 (setq v-r (Gensym nil))
        !           717:                 (f-addi (list 'getype (f-use v-r) 'name) v-t))))
        !           718: 
        !           719: (putprop 'eq 'f-eq 'x-spfn)
        !           720: 
        !           721: (def f-eq 
        !           722:   (lambda (v-l v-r v-t)
        !           723:          (prog (v-r1)
        !           724:                (cond ((f-test v-t)
        !           725:                       (setq v-t (f-xval (cdr v-t) v-r))
        !           726:                       (cond ((and (f-one (car v-l)) (f-one (cadr v-l)))
        !           727:                              (return (f-addi (list 'eqv (car v-l) (cadr v-l))
        !           728:                                              v-t))))
        !           729:                       (return (f-pusha v-l 
        !           730:                                        (Gensym nil)
        !           731:                                        (f-addi '(eqs) v-t))))))))
        !           732: 
        !           733: (putprop 'cons 'f-repl 'x-spfh)
        !           734: 
        !           735: '(putprop 'map 'f-domap 'x-spfh)
        !           736: 
        !           737: '(putprop 'mapc 'f-domap 'x-spfh)
        !           738: 
        !           739: '(putprop 'mapcar 'f-domap 'x-spfh)
        !           740: 
        !           741: '(putprop 'maplist 'f-domap 'x-spfh)
        !           742: 
        !           743: (putprop 'zerop 'f-zerop 'x-spfm)
        !           744: 
        !           745: (def f-zerop 
        !           746:   (lambda (v-e)
        !           747:          (list 'equal 0 (cadr v-e))))
        !           748: 
        !           749: (putprop 'plist 'f-plist 'x-spfm)
        !           750: 
        !           751: (def f-plist 
        !           752:   (lambda (v-e)
        !           753:          (list 'car (cadr v-e))))
        !           754: 
        !           755: (putprop 'go 'f-xgo 'x-opt)
        !           756: 
        !           757: (def f-xgo 
        !           758:   (lambda (v-i v-t) 
        !           759:          (setq v-t (f-chop v-t)) 
        !           760:          (cond ((equal (cadr v-i) (cadar v-t)) v-t) 
        !           761:                (t (cons v-i v-t))))) 
        !           762: 
        !           763: (putprop 'return 'f-xreturn 'x-opt)
        !           764: 
        !           765: (def f-xreturn 
        !           766:   (lambda (v-i v-t) 
        !           767:          (cons v-i (f-chop v-t)))) 
        !           768: 
        !           769: (putprop 'repeat 'f-xreturn 'x-opt)
        !           770: 
        !           771: (putprop 'false 'f-tfo 'x-opt) 
        !           772: 
        !           773: (putprop 'true 'f-tfo 'x-opt) 
        !           774: 
        !           775: 
        !           776: (putprop '*catch 'f-*catch 'x-spf)
        !           777: 
        !           778: 
        !           779: ;--- f-*catch - v-l : list of (tag exp) , tag is evaled, exp is to be run
        !           780: ;           - v-r : result register
        !           781: ;           - v-t : tail
        !           782: ;      This compiles a catch by emiting these intermediate codes:
        !           783: ;      ..calculate tag..
        !           784: ;      (catchent <gensym> <tag> nil)
        !           785: ;       .. code to eval (car v-l) ..
        !           786: ;      (catchexit)
        !           787: ;      (label <gensym>)
        !           788: ;
        !           789: ;      The catchent sets up a catch frame on the c-runtime stack.
        !           790: ;      The (car v-l) is evaluated and the result placed in r0 (it must
        !           791: ;      be since that is where the value would be thrown). If no throw
        !           792: ;      is done, it enters the catchexit which pops our catchframe off
        !           793: ;      the stack. If a throw is done it ends up at the label <gensym>
        !           794: ;      with the catch frame already popped off.
        !           795: ;
        !           796: (def f-*catch
        !           797:   (lambda (v-l v-r v-t)
        !           798:          (prog (v-loop v-tag x y z v-nr)
        !           799:                (setq v-tag (car v-l))
        !           800:                ; we check to make sure we can force v-r to be r0, else
        !           801:                ; we must give up.
        !           802:                (cond ((and  (get v-r 'x-reg) 
        !           803:                             (not (equal (get v-r 'x-reg) 0)))
        !           804:                       (err '"Can't compile catch correctly"))
        !           805:                      (t (f-make v-r 0)))
        !           806: 
        !           807:                (return
        !           808:                 (f-exp v-tag
        !           809:                        (setq v-nr (Gensym nil))
        !           810:                        (f-addi `(catchent ,(setq v-loop (Gensym nil)) 
        !           811:                                           ,(f-use v-nr)
        !           812:                                           nil)
        !           813:                                (f-exp (cadr v-l) (f-use v-r)
        !           814:                                       (f-addi `(catchexit)
        !           815:                                               (f-addi `(label ,v-loop) v-t)))))))))
        !           816: 
        !           817: (putprop 'errset 'f-errset 'x-spf)
        !           818: ;--- f-errset - v-l : list of (errset form [flag])
        !           819: ;            - v-r : place to put result.
        !           820: ;            - v-t : tail
        !           821: ;
        !           822: ;      This sets up an errset frame.  It is different than a catch in
        !           823: ;      that the tag is always (ER%all) and the result returned upon
        !           824: ;      a regular exit is listified.
        !           825: ;      again, we must insure that v-r can be forced to be r0 since
        !           826: ;      an err or error will place the result there.
        !           827: ;
        !           828: (def f-errset
        !           829:   (lambda (v-l v-r v-t)
        !           830:          (prog (v-loop v-tag v-flag v-nr)
        !           831:                (cond ((and (get v-r 'x-reg) (not (equal (get v-r 'x-reg) 0)))
        !           832:                       (err '"Can't compile errset  correctly"))
        !           833:                      (t (f-make v-r 0)))
        !           834: 
        !           835:                ; flag tells if error message will be reported, t if so.
        !           836:                ; t is the default
        !           837:                (cond ((cdr v-l) (setq v-flag (cadr v-l)))
        !           838:                      (t (setq v-flag t)))
        !           839: 
        !           840:                (return
        !           841:                  (f-exp v-flag
        !           842:                         (setq v-nr (Gensym nil))
        !           843:                         (f-addi `(catchent ,(setq v-loop (Gensym nil)) 
        !           844:                                            '(ER%all)
        !           845:                                            ,(f-use v-nr))
        !           846:                                 (f-exp (car v-l)
        !           847:                                        v-r
        !           848:                                        `((catchexit)
        !           849:                                          (push ,v-r)
        !           850:                                          (call ,v-r _Lncons 1)
        !           851:                                          (label ,v-loop)
        !           852:                                          ,@v-t))))))))
        !           853: 
        !           854: 
        !           855: 
        !           856: 
        !           857: (putprop '*throw 'f-*throw 'x-spf)
        !           858: 
        !           859: ;--- f-*throw - v-l : list of (tag exp)
        !           860: ;           - v-r : loc to eval exp to
        !           861: ;           - v-t : tail
        !           862: ;
        !           863: (def f-*throw
        !           864:   (lambda (v-l v-r v-t)
        !           865:          (let ((v-nr (Gensym nil)))
        !           866:               (f-exp (car v-l) 
        !           867:                      v-nr
        !           868:                       (f-exp (cadr v-l) v-r
        !           869:                              (f-addi `(*throw ,(f-use v-r) ,(f-use v-nr)) v-t))))))
        !           870: 
        !           871: 
        !           872: (putprop 'arg 'f-arg 'x-spf)
        !           873: 
        !           874: ;--- f-arg - v-l : list of arg to evaluate
        !           875: ;         - v-r : place to store value
        !           876: ;         - v-t : tail
        !           877: (def f-arg
        !           878:   (lambda (v-l v-r v-t)
        !           879:          (f-exp (car v-l) v-r
        !           880:                 (f-addi `(arg ,(f-use v-r))
        !           881:                         v-t))))

unix.superglobalmegacorp.com

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