Annotation of 3BSD/cmd/liszt/complrb.l, revision 1.1.1.1

1.1       root        1: ;--- file: complrb.l
                      2: (include "compmacs.l")
                      3: 
                      4: (setq compiler-name '"Lisp Compiler V3.0")
                      5: 
                      6: (setq old-top-level (getd 'top-level))
                      7: (setq original-readtable readtable)
                      8: (setq raw-readtable (makereadtable t))
                      9: 
                     10: ;--- lcfinit : called upon compiler startup. If there are any args
                     11: ;             on the command line, we build up a call to lcf, which
                     12: ;             will do the compile. Afterwards we exit.
                     13: ;
                     14: (def lcfinit
                     15:   (lambda nil
                     16:          (cond ((greaterp (argv -1) 1)      ; build up list of args
                     17:                 (do ((i (sub1 (argv -1)) (sub1 i)) (arglis))
                     18:                     ((lessp i 1) 
                     19:                      (exit (apply 'liszt arglis)))
                     20:                     (setq arglis (cons (argv i) arglis))))
                     21:                (t (patom compiler-name)
                     22:                   (terpr poport)
                     23:                   (putd 'top-level old-top-level)))))
                     24: 
                     25: (putd 'top-level (getd 'lcfinit))
                     26: 
                     27: 
                     28: 
                     29: 
                     30: ;--- lcf - v-x : list containing file name to compile and optionaly
                     31: ;               and output file name for the assembler source.
                     32: ;
                     33: (def liszt
                     34:   (nlambda (v-x)
                     35:           (prog (piport v-root v-ifile v-sfile v-ofile 
                     36:                         vp-ifile vp-sfile vps-crap
                     37:                         vps-include
                     38:                         k-pid v-crap tmp rootreal
                     39:                         tem temr starttime startptime startgccount
                     40:                         fl-asm fl-warn fl-verb fl-inter)
                     41: 
                     42:                 (setq starttime (syscall 13)   ; real time in seconds
                     43:                       startptime (ptime)
                     44:                       startgccount $gccount$)
                     45:                 (setq k-lams (setq k-nlams (setq k-macros nil)))
                     46:                 (cond ((null (boundp 'internal-macros))
                     47:                        (setq internal-macros nil)))
                     48:                 (cond ((null (boundp 'macros))
                     49:                        (setq macros nil)))
                     50:                 (setq k-free nil) 
                     51:                 (setq er-fatal 0)
                     52:                 (setq k-ptrs nil)
                     53:                 (setq k-disp -4)
                     54:                 (setq k-fnum 0)        ; function number
                     55:                 (setq w-bind nil)
                     56:                 (setq vps-include nil)
                     57:                 (setq twa-list nil)
                     58: 
                     59:                 (setq x-spec (gensym 'S))      ; flag for special atom
                     60:                 ; declare these special
                     61:                 (flag nil x-spec)
                     62:                 (flag t x-spec)
                     63: 
                     64:                 (sstatus feature complr)
                     65: 
                     66:                 ; process input form
                     67:                 (setq fl-asm t         ; assembler file assembled
                     68:                       fl-warn t        ; print warnings
                     69:                       fl-verb t        ; be verbose
                     70:                       fl-macl nil      ; compile maclisp file
                     71:                       fl-inter nil     ; print intermediate forms
                     72:                       )
                     73: 
                     74:                 (do ((i v-x (cdr i)))  ; for each argument
                     75:                     ((null i))
                     76:                     (setq tem (aexplodec (car i)))
                     77: 
                     78:                     (cond ((eq '- (car tem))   ; if switch
                     79:                            (do ((j (cdr tem) (cdr j)))
                     80:                                ((null j))
                     81:                                (cond ((eq 'S (car j)) (setq fl-asm nil))
                     82:                                      ((eq 'm (car j)) (setq fl-macl t))
                     83:                                      ((eq 'o (car j)) (setq v-ofile (cadr i)
                     84:                                                             i (cdr i)))
                     85:                                      ((eq 'w (car j)) (setq fl-warn t))
                     86:                                      ((eq 'q (car j)) (setq fl-verb nil))
                     87:                                      ((eq 'i (car j)) (setq fl-inter t))
                     88:                                      (t (comp-gerr "Unknown switch: "
                     89:                                                    (car j))))))
                     90:                           ((null v-root)
                     91:                            (setq temr (reverse tem))
                     92:                            (cond ((and (eq 'l (car temr))
                     93:                                        (eq '"." (cadr temr)))
                     94:                                   (setq rootreal nil)
                     95:                                   (setq v-root (apply 'concat (reverse (cddr temr)))))
                     96:                                  (t (setq v-root (car i)
                     97:                                           rootreal t))))
                     98: 
                     99:                           (t (comp-gerr "Extra input file name: " (car i)))))
                    100: 
                    101:                           
                    102: 
                    103:                 ; now see what the arguments have left us
                    104: 
                    105:                 (cond ((null v-root)
                    106:                        (comp-gerr "No file for input"))
                    107:                       ((or (portp 
                    108:                             (setq vp-ifile 
                    109:                                   (car (errset (infile 
                    110:                                                   (setq v-ifile 
                    111:                                                         (concat v-root '".l"))) 
                    112:                                                nil))))
                    113:                            (and rootreal
                    114:                                 (portp
                    115:                                  (setq vp-ifile
                    116:                                        (car (errset 
                    117:                                                 (infile (setq v-ifile v-root))
                    118:                                                 nil)))))))
                    119:                       (t (comp-gerr "Couldn't open the source file :"
                    120:                                     (or v-ifile))))
                    121: 
                    122: 
                    123:                 (setq k-pid (apply 'concat (cons 'F (cvt (syscall 20)))))
                    124:                 ; determine the name of the .s file
                    125:                 ; strategy: if fl-asm is t (only assemble) use (v-root).s
                    126:                 ;           else use /tmp/(k-pid).s
                    127:                 ;  
                    128:                 (cond  (fl-asm (setq v-sfile (concat '"/tmp/" 
                    129:                                                      k-pid 
                    130:                                                      '".s")))
                    131:                        (t (setq v-sfile (concat v-root '".s"))))
                    132: 
                    133:                 (cond ((not (portp (setq vp-sfile 
                    134:                                          (car (errset (outfile v-sfile) 
                    135:                                                       nil)))))
                    136:                        (comp-gerr "Couldn't open the .s file: "
                    137:                                   (or v-sfile))))
                    138:                                     
                    139:                 
                    140:                 ; determine the name of the .o file (object file)
                    141:                 ; strategy: if we aren't supposed to assemble the .s file
                    142:                 ;            don't worry about a name
                    143:                 ;           else if a name is given, use it
                    144:                 ;           else if use (v-root).o
                    145:                 (cond ((or v-ofile (null fl-asm)))             ;ignore
                    146:                       (t (setq v-ofile (concat v-root '".o"))))
                    147: 
                    148:                 (cond ((checkfatal) (return 1)))
                    149: 
                    150:                 (setq readtable (makereadtable nil))   ; use new readtable
                    151: 
                    152: 
                    153:                 ; make i/o descriptors to point to crap file then
                    154:                 ; unlink crap file so if we die while compiling the crap
                    155:                 ; file will disappear
                    156:                 (setq v-crap (concat k-pid k-fnum 'crap))
                    157:                 (setq tmp (outfile v-crap))            ; create output first
                    158:                 (setq vps-crap (cons (infile v-crap) tmp))
                    159:                 (apply 'syscall `(10 ',v-crap))        ; unlink it
                    160: 
                    161:                 (emit1 `(".." ,k-pid ,k-fnum :))
                    162:                 (emit1 '".long linker")
                    163:                 (emit1 '".long BINDER")
                    164: 
                    165:                 ; if the macsyma flag is set, change the syntax to the
                    166:                 ; maclisp standard syntax.  We must be careful that we
                    167:                 ; dont clobber any syntax changes made by files preloaded
                    168:                 ; into the compiler.
                    169: 
                    170:                 (cond (fl-macl (setsyntax '\/ 143)     ;  143 = vesc
                    171: 
                    172:                                (cond ((equal 143 (status syntax \\))
                    173:                                       (setsyntax '\\ 2)))
                    174: 
                    175:                                (setsyntax '\| 138)     ;  138 = vdq
                    176:                                (cond ((equal 138 (status syntax \"))
                    177:                                       (setsyntax '\" 2)))
                    178:                                (cond ((equal 198 (status syntax \[))
                    179:                                       (setsyntax '\[ 2)
                    180:                                       (setsyntax '\] 2)))
                    181:                                (setq ibase  8.)
                    182:                                (sstatus uctolc t)
                    183:                                
                    184:                                (flag 'ibase x-spec)    ; to be special
                    185:                                (flag 'base  x-spec)
                    186:                                (flag 'tty   x-spec)
                    187: 
                    188:                                (errset (cond ((null (getd 'macsyma-env))
                    189:                                               (load 'machacks)))
                    190:                                        nil)))
                    191: 
                    192:                 (cond ((checkfatal) (return 1)))  ; leave if fatal errors      
                    193: 
                    194:                 (comp-note "Compilation begins with " (or compiler-name))
                    195:                 (comp-note "source: " (or v-ifile) ", result: "
                    196:                            (cond (fl-asm v-ofile) (t v-sfile)))
                    197:                 (setq piport vp-ifile)         ; set to standard input
                    198: 
                    199:        loop
                    200:                ;(cond ((atom (errset (do ((i (read) (read))) 
                    201:                ;                         ((eq i 'eof) nil)
                    202:                ;                         (cleanup)
                    203:                ;                         (lcfform i))))
                    204:                ;       (patom '"error during compilation, I quit")))
                    205: 
                    206:                (cond ((atom (errset 
                    207:                              (do ((i (read piport '<<end-of-file>>) 
                    208:                                      (read piport '<<end-of-file>>))) 
                    209:                                  ((eq i '<<end-of-file>>) nil)
                    210:                                  (cleanup)
                    211:                                  (catch (lcfform i) Comp-error))))
                    212:                       (comp-note "Lisp error during compilation")
                    213:                       (setq piport nil)
                    214:                       (setq er-fatal (add1 er-fatal))
                    215:                       (return 1)))
                    216: 
                    217:                 (close piport)
                    218: 
                    219:                 (cond ((checkfatal) (return 1)))
                    220:                        
                    221:                 ; if doing special character stuff (maclisp) reassert
                    222:                 ; the state
                    223: 
                    224:                 (cond (vps-include
                    225:                        (comp-note  " done include")
                    226:                        (setq piport (car vps-include))
                    227:                        (setq vps-include (cdr vps-include))
                    228:                        (go loop)))
                    229: 
                    230:                 ; reset input base
                    231:                 (setq ibase 10.)
                    232: 
                    233: 
                    234:                 (close (cdr vps-crap))
                    235: 
                    236:                 (setq vp-ifile (car vps-crap))         ; read crap file
                    237: 
                    238:                 ((lambda (readtable)
                    239:                          (do ((i (read vp-ifile '<<end-of-file>>) 
                    240:                                  (read vp-ifile '<<end-of-file>>)))
                    241:                              ((eq i '<<end-of-file>>) nil)
                    242:                              (setq w-bind (cons (list 0 i 'Crap) w-bind)))
                    243: 
                    244:                          (cm-alist))
                    245:                  raw-readtable)
                    246: 
                    247:                 (close vp-sfile)               ; close assembler language file
                    248:                 (comp-note "Compilation complete")
                    249: 
                    250:                 (setq tem (Divide (difference (syscall 13) starttime) 60))
                    251:                 (comp-note " Real time: " (car tem) " minutes, "
                    252:                            (cadr tem) " seconds")
                    253:                 (setq tem (ptime))
                    254:                 (setq temr (Divide (difference (car tem) (car startptime))
                    255:                                    3600))
                    256:                 (comp-note " CPU time: " (car temr) " minutes, "
                    257:                            (quotient (cadr temr) 60.0) " seconds")
                    258:                 (setq temr (Divide (difference (cadr tem) (cadr startptime))
                    259:                                    3600))
                    260:                 (comp-note " of which " (car temr) " minutes and "
                    261:                            (quotient (cadr temr) 60.0) 
                    262:                            " seconds were for the "
                    263:                            (difference $gccount$ startgccount)
                    264:                            " gcs which were done")
                    265: 
                    266: 
                    267:                 (cond (fl-asm                  ; assemble file 
                    268:                         (comp-note "Assembly begins")
                    269:                         (cond ((not 
                    270:                                 (zerop 
                    271:                                    (setq tmp
                    272:                                          (apply 'process 
                    273:                                                 (ncons (concat '"as -o "
                    274:                                                                    v-ofile
                    275:                                                                    '" "
                    276:                                                                    v-sfile))))))
                    277:                                (comp-gerr "Assembler detected error, code: "
                    278:                                           (or tmp)))
                    279:                               (t (comp-note "Assembly completed successfully")))))
                    280:                 (cond (fl-asm (apply 'syscall `(10 ',v-sfile))))
                    281: 
                    282:                 (setq readtable original-readtable)
                    283:                 (return 0))))
                    284: 
                    285: (def checkfatal
                    286:   (lambda nil
                    287:          (cond ((greaterp er-fatal 0)
                    288:                 (comp-note "Compilation aborted")
                    289:                 t))))
                    290: 
                    291: 
                    292: ;--- lcfform - i : form to compile
                    293: ;      This compiles one form.
                    294: ;
                    295: (def lcfform
                    296:   (lambda (i)
                    297:      (prog (tmp v-x)
                    298:          ; macro expand
                    299:          (setq i (cmacroexpand i))
                    300:          ; now look at what is left
                    301:          (cond ((eq (car i) 'def) ; jkf mod
                    302:                 (cond (fl-verb (print (cadr i)) (terpr)(drain)))
                    303:                 (dodef i))
                    304:                ((eq (car i) 'declare) (dodcl i))
                    305:                ((eq (car i) 'eval-when) (doevalwhen i))
                    306:                ((and (eq (car i) 'progn) (equal (cadr i) '(quote compile)))
                    307:                 ((lambda (internal-macros)     ; compile macros too
                    308:                          (mapc 'lcfform (cddr i)))
                    309:                       t))
                    310:                ((or (eq (car i) '"%include")
                    311:                     (eq (car i) '"include"))
                    312:                 (cond ((or (portp (setq v-x 
                    313:                                         (car (errset (infile (cadr i)) nil))))
                    314:                            (portp (setq v-x 
                    315:                                         (car (errset (infile (concat '"/usr/lib/lisp"
                    316:                                                             (cadr i))) 
                    317:                                                      nil)))))
                    318:                        (setq vps-include (cons piport vps-include))
                    319:                        (setq piport v-x)
                    320:                        (comp-note " INCLUDEing file: " (cadr i)))
                    321:                       (t (comp-gerr "Cannot open include file: " (cadr i)))))
                    322:                (t ((lambda (readtable) 
                    323:                            (print i (cdr vps-crap))
                    324:                            (terpr (cdr vps-crap)))
                    325:                    raw-readtable))))))
                    326: 
                    327: ;--- cmacroexpand - i : functional form
                    328: ;      the form is macro expanded on the top level as many times as
                    329: ;      possible.
                    330: ;
                    331: (def cmacroexpand
                    332:   (lambda (i)
                    333:          (cond ((atom i) i)
                    334:                (t (do ((j (ismacro (car i)) (ismacro (car i)))
                    335:                        (tmp))
                    336:                       ((null j)  i)
                    337:                       (cond ((bcdp j)
                    338:                              (putd (setq tmp (Gensym nil))
                    339:                                    (mfunction (getentry j) 'nlambda)))
                    340:                             (t (setq tmp (cons 'nlambda (cdr j)))))
                    341:                       (setq i (apply tmp i))
                    342:                       (cond ((atom i) (return i))))))))
                    343: 
                    344: (def dodef
                    345:   (lambda (v-f)
                    346:          (prog (v-n v-t v-c w-save w-ret w-labs w-locs)
                    347:                (setq k-current (setq v-n (cadr v-f)))  ; v-n <= name of func
                    348:                ; add function to approp. list
                    349:                (cond ((or (eq (setq v-t (caaddr v-f)) 'lambda)
                    350:                           (eq v-t 'lexpr))
                    351:                       (setq k-lams (cons (list v-n t) k-lams)
                    352:                             k-ftype v-t
                    353:                             v-t 'lambda))
                    354:                      ((eq v-t 'nlambda)
                    355:                       (setq k-nlams (cons (list v-n t) k-nlams)
                    356:                             k-ftype 'nlambda))
                    357:                      ((eq v-t 'macro)
                    358:                       (setq k-macros (cons (list v-n (caddr v-f)) k-macros))
                    359:                       (setq k-ftype 'macro)
                    360:                       (eval v-f)
                    361:                       ; if macros is nil, we do not compile this macro
                    362:                       (cond ((and (null macros)
                    363:                                   (null internal-macros))
                    364:                              (return nil))))
                    365:                      (t (comp-err (or v-n) " has an unknown function type"
                    366:                                   (v-f))))
                    367: 
                    368: 
                    369:                (setq v-c (concat k-pid k-fnum))        ; v-c <= unique name
                    370:                (setq k-fnum (add1 k-fnum))
                    371:                (cm-bind v-c v-n v-t)                   ; update k-regs
                    372:                (setq v-t (f-func (cdaddr v-f))) ; do parse
                    373:                (emit3 '# v-c v-n)                      ; put out header
                    374:                (cm-alst4 v-n)
                    375:                (cond (fl-inter (print v-t)(terpr)))
                    376:                (cm-emit v-t v-c))))                    ; emit code
                    377:  
                    378: ;--- doevalwhen, process evalwhen directive. This is inadequate.
                    379: ;
                    380:  (def doevalwhen 
                    381:       (lambda (v-f)
                    382:              (prog (docom dolod)
                    383:                    (setq docom (member 'compile (cadr v-f))
                    384:                          
                    385:                          dolod (member 'load (cadr v-f)))
                    386:                    (mapc '(lambda (frm) (cond (docom (eval frm)))
                    387:                                         (cond (dolod 
                    388:                                                ((lambda (internal-macros) 
                    389:                                                         (lcfform frm))
                    390:                                                 t))))
                    391:                          (cddr v-f)))))
                    392: 
                    393: 
                    394: ;---- dodcl - v-f declare form
                    395: ;      process the declare form given. We evaluate each arg
                    396: ;
                    397: (def dodcl 
                    398:   (lambda (v-f)
                    399:          (setq v-f (cdr v-f))
                    400:          (do ((i (car v-f) (car v-f))) 
                    401:              ((null i))
                    402:              (setq v-f (cdr v-f))
                    403:              (cond ((getd (car i)) (eval i)) ; if this is a function
                    404:                    (t (comp-warn "Unknown declare attribute: " (car i)))))))
                    405: 
                    406: ;---> handlers for declare forms
                    407: ;
                    408: (def *fexpr
                    409:   (nlambda (args)
                    410:           (mapc '(lambda (v-x)
                    411:                          (setq k-nlams (cons (list v-x t) k-nlams)))
                    412:                 args)))
                    413: (def special
                    414:   (nlambda (v-l) 
                    415:           (mapc '(lambda (v-a)
                    416:                          (unflag v-a x-con) 
                    417:                          (flag v-a x-spec)) 
                    418:                 v-l)
                    419:           t))
                    420: (def unspecial
                    421:   (nlambda (v-l) 
                    422:           (mapc '(lambda (v-a) 
                    423:                          (unflag v-a x-spec)) 
                    424:                 v-l)
                    425:           t))
                    426: 
                    427: (def *expr (nlambda (args) nil))       ; ignore
                    428: 
                    429: (def macros (nlambda (args) (setq macros (car args))))
                    430: ;---> end declare form handlers
                    431: 
                    432: 
                    433: (def cm-bind
                    434:   (lambda (v-lab v-atm v-type)
                    435:          (setq w-bind (cons (list v-lab v-atm v-type) w-bind))))
                    436: 
                    437: (def cm-emit 
                    438:   (lambda (v-t v-nm) 
                    439:          (setq k-back (setq k-regs nil)) 
                    440:          (setq k-code v-t) 
                    441:          (prog (v-i v-l) 
                    442:                (emit2 '".globl" v-nm)
                    443:                (emit1 (list v-nm ':))
                    444:           next (cond ((null k-code) (return))) 
                    445:                (setq v-i (car k-code)) 
                    446:                (setq k-code (cdr k-code)) 
                    447:                (setq v-l (get (car v-i) x-emit)) 
                    448:                (cond ((null (cdr v-i)) 
                    449:                       (funcall v-l) 
                    450:                       (go next)) 
                    451:                      ((ifflag (car v-i) x-asg) 
                    452:                       (setq v-t (e-reg (cadr v-i) nil))) 
                    453:                      (t (setq v-t (cadr v-i)))) 
                    454:                (apply v-l (rplaca (cdr v-i) v-t)) 
                    455:                (go next))))
                    456: 
                    457: ;--- cm-alist  - print out the list of special lispvalues we reference
                    458: ;               in compiled code
                    459: ;
                    460: 
                    461: (def cm-alist
                    462:   (lambda nil
                    463:          (prog (cm-alv)
                    464:                (cond (faslflag (emit1 '".text"))
                    465:                      (t (emit1 '".data")))
                    466:                (emit1 '".align 2")
                    467:                (emit1 '"lbnp: .long _bnp")
                    468:                (emit1 '"lfun: .long __qfuncl")
                    469:                (emit1 '"lf4: .long __qf4")
                    470:                (emit1 '"lf3: .long __qf3")
                    471:                (emit1 '"lf2: .long __qf2")
                    472:                (emit1 '"lf1: .long __qf1")
                    473:                (emit1 '"lf0: .long __qf0")
                    474:                (emit2 '"lgc: .long" 0)
                    475:                (emit1 '"linker:" )
                    476:                (mapc 'cm-alst1 (reverse k-ptrs))
                    477:                (emit2 '".long" -1)
                    478:                (cond (faslflag (emit1 '".data"))
                    479:                      (t (emit1 '".text")))
                    480:                (emit1 '".align 2")
                    481:                (emit1 '"B:")
                    482:                (emit1 '"BINDER:")
                    483:                (mapc 'cm-alst2 (reverse w-bind))
                    484:                (emit4 '".long" -1 -1 -1)
                    485:                (emit1 '"litstrt:")
                    486:                (mapc 'cm-alst3 (reverse cm-alv))
                    487:                (emit1 '"litend:")
                    488:                (cleanup))))
                    489: 
                    490: 
                    491: (def cm-alst1
                    492:   (lambda (v-x)
                    493:          (prog (v-g)
                    494:                (setq v-g (Gensym 's))
                    495:                (emit2 '".long" (list v-g '-B))
                    496:                (putprop v-g (car v-x) 'label)
                    497:                (setq cm-alv (cons v-g cm-alv)))))
                    498: 
                    499: (def cm-alst2
                    500:   (lambda (v-x)
                    501:          (prog (v-g)
                    502:                (emit2 '".long" (car v-x))
                    503:                (setq v-g (Gensym 's))
                    504:                (emit2 '".long" (list v-g '-B))
                    505:                (putprop v-g (cadr v-x) 'label)
                    506:                (setq cm-alv (cons v-g cm-alv))
                    507:                (setq v-g (caddr v-x))
                    508:                (emit2 '".long"
                    509:                       (cond ((eq v-g 'lambda) 0)
                    510:                             ((eq v-g 'nlambda) 1)
                    511:                             ((eq v-g 'macro) 2)
                    512:                             ((eq v-g 'Crap) 99)
                    513:                             (t 'UDEF_TYPE))))))
                    514: 
                    515: (def cm-alst3
                    516:   (lambda (v-x)
                    517:          ($pr$ v-x)
                    518:          ($pr$ '": ")
                    519:          (setq v-x  (get v-x 'label))
                    520:          (cm-alst4 v-x)))
                    521: 
                    522: ;--- cm-alst4  - v-x : s-expression
                    523: ;      the given expression is exploded and printed as a string to the
                    524: ;      assembler, this requires that each character be individually
                    525: ;      noted and that the number of bytes on a line be limited.
                    526: ;
                    527: (def cm-alst4
                    528:   (lambda (v-x)
                    529:          ($pr$ '".byte ")
                    530:          (do ((l (explode v-x) (cdr l))
                    531:               (cnt 1 (add1 cnt)))
                    532:              ((null l) ($pr$ 0) ($terpri))
                    533:              ($pr$ '\')
                    534:              ($pr$ (car l))
                    535:              (cond ((greaterp cnt 13) ($terpri) ($pr$ '".byte ") (setq cnt 0))
                    536:                    (t ($pr$ '\,))))))
                    537: ;--- w-save
                    538: ;      stack the values of w-ret and w-labs
                    539: ;
                    540: (def w-save
                    541:   (lambda nil (setq w-save (cons `(,w-ret ,w-labs ,w-locs) w-save))))
                    542: 
                    543: ;--- w-unsave
                    544: ;      restore the values of w-ret  and w-labs, popping them
                    545: ; off the w-save stack
                    546: ;
                    547: (def w-unsave
                    548:   (lambda nil (setq w-ret (caar w-save) 
                    549:                    w-labs (cadar w-save)
                    550:                    w-locs (caddar w-save)
                    551:                    w-save (cdr w-save))))
                    552: 
                    553: 
                    554: ;--- f-exp - v-e form to evaluate
                    555: ;         - v-r location to place result in.
                    556: ;         - v-t restof stuff (intermidiate forms)
                    557: ;
                    558: ;      This is the real workhorse of the compiler.
                    559: ;
                    560: (def f-exp 
                    561:   (lambda (v-e v-r v-t) 
                    562:          (prog (v-f v-i v-tem) 
                    563:            begin (cond ; atoms
                    564:                        ((f-one v-e) 
                    565:                         ; if the symbol has not been declared special and is
                    566:                         ; not a local variable, we declare it special.
                    567:                         (g-specialchk v-e)
                    568:                         (return (f-addi (list 'get v-r v-e) v-t)))
                    569: 
                    570:                        ; lambda expressions, we do the correct thing.
                    571:                        ; should check for bad forms here rather than call
                    572:                        ; f-chkf
                    573:                        ((not (atom (setq v-f (car v-e)))) 
                    574:                         (setq v-f (cmacroexpand v-f))
                    575:                         ; must check if the expression changes to an atom
                    576:                         (cond ((atom v-f) 
                    577:                                (setq v-e (cons v-f (cdr v-e)))
                    578:                                (go begin)))
                    579: 
                    580:                         (cond ((eq 'lambda (car v-f))
                    581:                                (return (f-lambexp v-e v-r v-t)))
                    582:                               ; this case is necessary to compile
                    583:                               ; ('add 1 2)  which the interpreter will
                    584:                               ; handle and I guess we should too
                    585:                               ((eq 'quote (car v-f))
                    586:                                (comp-warn "Bizzare function name " (or v-f) N)
                    587:                                (setq v-e (cons (cadr v-f) (cdr v-e)))
                    588:                                (go begin))
                    589:                               (t (comp-err " Illegal expression: "
                    590:                                            (or v-f) 
                    591:                                            N))))
                    592: 
                    593:                        ; macro expand and continue
                    594:                        ((and (or (setq v-e (cmacroexpand v-e)) t)
                    595:                              (cond ((or (atom v-e)
                    596:                                         (not (atom (car v-e))))
                    597:                                     (go begin))        ; if reduce to atom
                    598:                                                        ; or lambda exp
                    599:                                    (t (setq v-f (car v-e))))
                    600:                              nil))
                    601: 
                    602:                        ; special functions
                    603:                        ((setq v-i (get v-f x-spf)) (go special)) 
                    604:                        ((setq v-i (get v-f x-spfq))
                    605:                         (put v-f x-spfq nil)
                    606:                         (go special))
                    607:                        ((setq v-i (get v-f x-spfn)) (go special)) 
                    608:                        ((setq v-i (get v-f x-spfh)) 
                    609:                         (setq v-e (funcall v-i v-e)) 
                    610:                         (go normal)) 
                    611: 
                    612:                        ; macro within compiler
                    613:                        ((setq v-i (get v-f 'x-spfm))
                    614:                         (setq v-e (funcall v-i v-e))
                    615:                         (go begin))
                    616: 
                    617:                        ; nlambbdas, we quote the args
                    618:                        ((isnlam v-f) 
                    619:                         (setq v-e (list v-f (list 'quote (cdr v-e)))) 
                    620:                         (go normal)) 
                    621: 
                    622: 
                    623:                        ; cxr form where x is elt of {a d}
                    624:                        ((setq v-i (chain v-f)) 
                    625:                         (setq v-t (f-addi 
                    626:                                    (list 'chain 
                    627:                                           v-r 
                    628:                                           (setq v-r (f-use (Gensym nil)))
                    629:                                          v-i)
                    630:                                    v-t)) 
                    631:                         (setq v-e (cadr v-e))   ; calc expr to new v-r
                    632:                         (go begin)) 
                    633: 
                    634:                        ; if this is not the last form before a return,
                    635:                        ; we go to normal to do a function invocation
                    636:                        ; otherwise we look to see if tail merging is
                    637:                        ; possible.
                    638:                        ((not (eq (caar v-t) 'return)) (go normal)) 
                    639:                        ((or (eq (setq v-i w-bv) t) 
                    640:                             (not (equal v-f w-name))) (go normal)) 
                    641:                        ((not (f-iter (cdr v-e) (reverse v-i))) (go normal)) ) 
                    642: 
                    643:                ; do tail merging.
                    644:                (setq v-t (f-addi '(repeat) v-t)) 
                    645:                (setq v-e (reverse (cdr v-e))) 
                    646:        iterate (cond ((null v-e) (return v-t)) 
                    647:                      ((equal (car v-e) (car v-i)) (go next))) 
                    648:                (setq v-t (f-addi (list 'set 
                    649:                                        (setq v-r (f-reg 'set))
                    650:                                        (car v-i)) 
                    651:                                  v-t)) 
                    652:                (setq v-t (f-exp (car v-e) v-r v-t)) 
                    653:           next (setq v-e (cdr v-e)) 
                    654:                (setq v-i (cdr v-i)) 
                    655:                (go iterate) 
                    656: 
                    657:                ; the function will be handled specially by the compiler
                    658:        special (cond ((setq v-i (funcall v-i (cdr v-e) v-r v-t))
                    659:                       (return v-i))) 
                    660: 
                    661:                ; normal handling, call function.
                    662:                ; if this is a system function, do it quickly
                    663:         normal (cond ((setq v-i (get (car v-e) 'x-sysf))       ; system fcn
                    664:                       (setq v-t 
                    665:                             (f-pusha (cdr v-e) 
                    666:                                      (Gensym nil) 
                    667:                                      (f-addi `(call ,(f-make v-r r-xv) 
                    668:                                                     ,v-i
                    669:                                                     ,(length (cdr v-e))) 
                    670:                                              v-t))))
                    671:                      (t (setq v-t 
                    672:                               (f-pusha `((quote ,(car v-e)) ,@(cdr v-e))
                    673:                                       (Gensym nil)
                    674:                                       (f-addi `(call ,(f-make v-r r-xv) 
                    675:                                                      nil
                    676:                                                      ,(length v-e)) 
                    677:                                               v-t))))) 
                    678:                 
                    679:                (return v-t))))
                    680: 
                    681: ;--- g-specialchk - v-e : expression
                    682: ; if v-e is a symbol and not declared special and not a local variable
                    683: ; we complain and delare it special
                    684: ; v-e is returned.
                    685: ;
                    686: (def g-specialchk
                    687:   (lambda (v-e)
                    688:          (cond ((and (symbolp v-e) 
                    689:                      (not (get v-e x-spec))
                    690:                      (not (member v-e w-locs)))
                    691:                 (flag v-e x-spec)
                    692:                 (comp-warn (or v-e) " declared special by compiler")))
                    693:          v-e))
                    694: 
                    695: 
                    696: ;--- f-lambexp - v-e : lambda expression: ((lambda (x y z) exp) a b c)
                    697: ;             - v-r : weather where result should be placed
                    698: ;             - v-t : tail
                    699: ;
                    700: ;      This compiled a lambda expression.  This is a very simple do-expression
                    701: ; with the difference that returns are not allowed from within it.
                    702: 
                    703: (def f-lambexp
                    704:   (lambda (v-e v-r v-t)
                    705:          (f-pusha (cdr v-e) 
                    706:                   (Gensym nil)
                    707:                   (f-lambbody (cdar v-e) v-r (length (cadar v-e)) v-t))))
                    708: 
                    709: ;--- f-lambbody - v-e : args + body of lambda ((a b c) exp1 exp2 ...)
                    710: ;              - v-ags : number of args pushed for this lambda, it will
                    711: ;                        normally equal the length of (cadr v-e) but
                    712: ;                        in the case of the top level lambda expression
                    713: ;                        in a function it will be 0
                    714: ;              - v-r : psreg to place result in
                    715: ;              - v-t : tail
                    716: ;      We emit the intermediate expressions necessary to evaluate the
                    717: ;      lambda body
                    718: ;
                    719: (def f-lambbody
                    720:   (lambda (v-e v-r v-ags v-t)
                    721:          (w-save)                      ; stack old values
                    722:          (prog (w-ret w-labs tmp)
                    723:                (setq tmp `((begin ,v-ags)
                    724:                            ,@(mapcar '(lambda (arg) (setq w-locs
                    725:                                                           (cons arg w-locs))
                    726:                                                    `(bind ,arg))
                    727:                                      (car v-e))
                    728:                            ,@(f-seq (cdr v-e) 
                    729:                                     v-r 
                    730:                                     `((end nil)
                    731:                                       ,@v-t))))
                    732:                (w-unsave)
                    733:                (return tmp))))
                    734: 
                    735: ;--- f-func - v-l    : function args and body.
                    736: ;
                    737: ;      result is: (entry type)         ; type is lambda,lexpr, macro 
                    738: ;                                              or nlambda
                    739: ;                 ..body.. 
                    740: ;                 
                    741: ;                 (fini) 
                    742: ;
                    743: (def f-func 
                    744:   (lambda (v-l) 
                    745:          `((entry ,k-ftype)
                    746:            ,@(f-lambbody v-l 'xv 0 '((fini))))))
                    747: 
                    748: 
                    749: ;--- f-prog - v-l : args + prog body
                    750: ;          - v-r : psreg to store result in
                    751: ;          - v-t : tail
                    752: ;
                    753: (def f-prog
                    754:   (lambda (v-l v-r v-t)
                    755:          (w-save)
                    756:          (prog (w-ret tmp retlb w-labs)
                    757:                (setq tmp (length (car v-l))    ; number of locals
                    758:                      retlb (Gensym nil)        ; label to leave prog
                    759:                      w-labs (Gensym nil)       ; hang labels here
                    760:                      w-ret `(,v-r . (go ,retlb)))
                    761:                
                    762:                (setq tmp `((pushnil ,tmp)      ; start out with nils
                    763:                            (begin ,tmp)                ; declare variables
                    764:                            ,@(mapcar '(lambda (arg) (setq w-locs
                    765:                                                           (cons arg w-locs))
                    766:                                                    `(bind ,arg))
                    767:                                      (car v-l))        ; bind locals
                    768:                            ,@(f-seqp (cdr v-l) (Gensym nil) 
                    769:                                      `((get ,v-r nil)
                    770:                                        (end ,retlb)
                    771:                                        ,@v-t))))
                    772:                (w-unsave)
                    773:                (return tmp))))
                    774: 
                    775: 

unix.superglobalmegacorp.com

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