Annotation of 41BSD/cmd/liszt/car.l, revision 1.1

1.1     ! root        1: ;                      l i s z t   v 4    
        !             2: ;
        !             3: ;
        !             4: ;
        !             5: ;                  A compiler for Franz lisp
        !             6: ;
        !             7: ; Copyright (c) 1980 ,  The Regents of the University of California.
        !             8: ; All rights reserved.  
        !             9: ; author: j. foderaro
        !            10: ;
        !            11: ; Section INIT -- initialization and macros
        !            12: 
        !            13: (include "caspecs.l")
        !            14: 
        !            15: (eval-when (compile eval)
        !            16:   (cond ((not (getd 'If))
        !            17:         (fasl 'camacs))))
        !            18: 
        !            19: ;the version number is maintained by hand, and is written twice
        !            20: ; once for the benefit of the user
        !            21: (setq compiler-name "Lisp Compiler 5.0")
        !            22: ; and the other time for SCCS's what command
        !            23: (setq sccs-compiler-name "@(#)Liszt version 5.0")
        !            24: 
        !            25: (setq sectioncarid "@(#)car.l  5.4     11/11/80")  ; id for SCCS
        !            26: 
        !            27: (setq original-readtable readtable)
        !            28: (setq raw-readtable (makereadtable t))
        !            29: 
        !            30: ;--- special handlers
        !            31: (putprop 'and  'cc-and         'fl-exprcc)
        !            32: (putprop 'arg          'cc-arg         'fl-exprcc)
        !            33: (putprop 'atom         'cc-atom        'fl-exprcc)
        !            34: (putprop 'bigp  'cc-bigp       'fl-exprcc)
        !            35: (putprop 'bcdp 'cc-bcdp        'fl-exprcc)
        !            36: (putprop '*catch 'c-*catch     'fl-expr)
        !            37: (putprop 'comment 'cc-ignore   'fl-exprcc)
        !            38: (putprop 'cond 'c-cond         'fl-expr)
        !            39: (putprop 'cons 'c-cons         'fl-expr)
        !            40: (putprop 'cxr  'c-cxr          'fl-exprcc)
        !            41: (putprop 'declare 'c-declare   'fl-expr)
        !            42: (putprop 'do   'c-do           'fl-expr)
        !            43: (putprop 'dtpr 'cc-dtpr        'fl-exprcc)
        !            44: (putprop 'eq   'cc-eq          'fl-exprcc)
        !            45: (putprop 'equal 'cc-equal      'fl-exprcc)
        !            46: (putprop '=    'cc-equal       'fl-exprcc)
        !            47: (putprop 'errset 'c-errset     'fl-expr)
        !            48: (putprop 'fixp  'cc-fixp       'fl-exprcc)
        !            49: (putprop 'floatp 'cc-floatp    'fl-exprcc)
        !            50: (putprop 'get   'c-get         'fl-expr)
        !            51: (putprop 'go   'c-go           'fl-expr)
        !            52: (putprop 'list 'c-list         'fl-expr)
        !            53: (putprop 'map  'cm-map         'fl-exprm)
        !            54: (putprop 'mapc 'cm-mapc        'fl-exprm)
        !            55: (putprop 'mapcan 'cm-mapcan    'fl-exprm)
        !            56: (putprop 'mapcar 'cm-mapcar    'fl-exprm)
        !            57: (putprop 'mapcon 'cm-mapcon    'fl-exprm)
        !            58: (putprop 'maplist 'cm-maplist  'fl-exprm)
        !            59: (putprop 'memq   'cc-memq      'fl-exprcc)
        !            60: (putprop 'not  'cc-not         'fl-exprcc)
        !            61: (putprop 'null 'cc-not         'fl-exprcc)
        !            62: (putprop 'numberp 'cc-numberp  'fl-exprcc)
        !            63: (putprop 'or   'cc-or          'fl-exprcc)
        !            64: (putprop 'prog 'c-prog         'fl-expr)
        !            65: (putprop 'progn        'cm-progn       'fl-exprm)
        !            66: (putprop 'prog1 'cm-prog1      'fl-exprm)
        !            67: (putprop 'prog2        'cm-prog2       'fl-exprm)
        !            68: (putprop 'quote        'cc-quote       'fl-exprcc)
        !            69: (putprop 'return 'c-return     'fl-expr)
        !            70: (putprop 'rplaca 'c-rplaca     'fl-expr)
        !            71: (putprop 'rplacd 'c-rplacd     'fl-expr)
        !            72: (putprop 'setarg 'c-setarg     'fl-expr)
        !            73: (putprop 'setq 'cc-setq        'fl-exprcc)
        !            74: (putprop 'stringp 'cc-stringp  'fl-exprcc)
        !            75: (putprop 'symbolp 'cc-symbolp  'fl-exprcc)
        !            76: (putprop 'symeval 'cm-symeval  'fl-exprm)
        !            77: (putprop '*throw 'c-*throw     'fl-expr)
        !            78: (putprop 'typep   'cc-typep    'fl-exprcc)
        !            79: (putprop 'zerop   'cm-zerop    'fl-exprm)
        !            80: 
        !            81: (putprop '1+   'c-1+   'fl-expr)
        !            82: (putprop '1-   'c-1-   'fl-expr)
        !            83: (putprop '+    'c-+    'fl-expr)
        !            84: (putprop '-    'c--    'fl-expr)
        !            85: (putprop '*    'c-*    'fl-expr)
        !            86: (putprop '/    'c-/    'fl-expr)
        !            87: (putprop '\\   'c-\\   'fl-expr)
        !            88: 
        !            89: 
        !            90: 
        !            91: 
        !            92: ; Section INTERF -- user interface
        !            93: 
        !            94: 
        !            95: ;--- lisztinit : called upon compiler startup. If there are any args
        !            96: ;             on the command line, we build up a call to lcf, which
        !            97: ;             will do the compile. Afterwards we exit.
        !            98: ;
        !            99: (def lisztinit
        !           100:   (lambda nil
        !           101:          (cond ((greaterp (argv -1) 1)      ; build up list of args
        !           102:                 (do ((i (1- (argv -1)) (1- i)) (arglis))
        !           103:                     ((lessp i 1) 
        !           104:                      (setq user-top-level nil)
        !           105:                      (exit (apply 'liszt arglis)))
        !           106:                     (setq arglis (cons (argv i) arglis))))
        !           107:                (t (patom compiler-name)
        !           108:                   (terpr poport)
        !           109:                   (setq user-top-level nil)))))
        !           110: 
        !           111: (setq user-top-level 'lisztinit)
        !           112: 
        !           113: 
        !           114: 
        !           115: ;--- lcf - v-x : list containing file name to compile and optionaly
        !           116: ;               and output file name for the assembler source.
        !           117: ;
        !           118: (def liszt
        !           119:   (nlambda (v-x)
        !           120:           (prog (piport v-root v-ifile v-sfile v-ofile 
        !           121:                         vp-ifile vp-sfile vps-crap
        !           122:                         vps-include
        !           123:                         tmp rootreal
        !           124:                         g-fname
        !           125:                         tem temr starttime startptime startgccount
        !           126:                         fl-asm fl-warn fl-verb fl-inter fl-xref fl-uci
        !           127:                         g-skipcode g-dropnpcnt)
        !           128: 
        !           129:                 ; turn on monitoring if it exists
        !           130:                 #+monitoring
        !           131:                 (errset (progn (monitor t)     ; turn it on
        !           132:                                (print 'monitor-on)
        !           133:                                (terpr))
        !           134:                         nil)
        !           135:                 (setq starttime (syscall 13)   ; real time in seconds
        !           136:                       startptime (ptime)
        !           137:                       startgccount $gccount$)
        !           138:                 (cond ((null (boundp 'internal-macros))
        !           139:                        (setq internal-macros nil)))
        !           140:                 (cond ((null (boundp 'macros))
        !           141:                        (setq macros nil)))
        !           142:                 (setq er-fatal 0)
        !           143:                 (setq vps-include nil)
        !           144:                 (setq twa-list nil)
        !           145:                 (setq liszt-eof-forms nil)
        !           146: 
        !           147:                 ; set up once only g variables
        !           148:                 (setq g-comments nil
        !           149:                       g-current nil            ; current function name
        !           150:                       g-funcs nil
        !           151:                       g-lits nil
        !           152:                       g-trueloc nil
        !           153:                       g-tran nil
        !           154:                       g-allf nil               ; used in xrefs
        !           155:                       g-reguse '((r5 0 . nil) (r4 0 . nil) (r3 0 . nil) 
        !           156:                                  (r2 0 . nil) (r7 0 . nil) (r1 0 . nil))
        !           157:                       g-trancnt 0
        !           158:                       g-ignorereg nil
        !           159:                       g-litcnt 0)
        !           160:                 (setq g-spec (gensym 'S))      ; flag for special atom
        !           161:                 (setq special nil)             ; t if all vrbs are special
        !           162:                 (setq g-functype (gensym)
        !           163:                       g-bindloc  (gensym)
        !           164:                       g-localf   (gensym)
        !           165:                       g-tranloc  (gensym))
        !           166: 
        !           167:                 ; declare these special
        !           168: 
        !           169:                 (sstatus feature complr)
        !           170:                 (d-makespec 't)                ; always special
        !           171: 
        !           172:                 ; process input form
        !           173:                 (setq fl-asm t         ; assembler file assembled
        !           174:                       fl-warn t        ; print warnings
        !           175:                       fl-verb t        ; be verbose
        !           176:                       fl-macl nil      ; compile maclisp file
        !           177:                       fl-inter nil     ; do interlisp compatablity
        !           178:                       fl-tty nil       ; put .s on tty
        !           179:                       fl-comments nil    ; put in comments
        !           180:                       fl-profile nil   ; profiling
        !           181:                       fl-tran    t     ; use transfer tables
        !           182:                       fl-vms   nil     ; vms hacks
        !           183:                       fl-xref  nil     ; xrefs
        !           184:                       fl-uci   nil     ; uci lisp compatibility
        !           185:                       )
        !           186: 
        !           187:                 (do ((i v-x (cdr i)))  ; for each argument
        !           188:                     ((null i))
        !           189:                     (setq tem (aexplodec (car i)))
        !           190: 
        !           191:                     (cond ((eq '- (car tem))   ; if switch
        !           192:                            (do ((j (cdr tem) (cdr j)))
        !           193:                                ((null j))
        !           194:                                (cond ((eq 'S (car j)) (setq fl-asm nil))
        !           195:                                      ((eq 'C (car j)) (setq fl-comments t))
        !           196:                                      ((eq 'm (car j)) (setq fl-macl t))
        !           197:                                      ((eq 'o (car j)) (setq v-ofile (cadr i)
        !           198:                                                             i (cdr i)))
        !           199:                                      ((eq 'w (car j)) (setq fl-warn nil))
        !           200:                                      ((eq 'q (car j)) (setq fl-verb nil))
        !           201:                                      ((eq 'T (car j)) (setq fl-tty t))
        !           202:                                      ((eq 'i (car j)) (setq fl-inter t))
        !           203:                                      ((eq 'p (car j)) (setq fl-profile t))
        !           204:                                      ((eq 'F (car j)) (setq fl-tran nil))
        !           205:                                      ((eq 'v (car j)) (setq fl-vms t))
        !           206:                                      ((eq 'x (car j)) (setq fl-xref t))
        !           207:                                      ((eq 'u (car j)) (setq fl-uci  t))
        !           208:                                      (t (comp-gerr "Unknown switch: "
        !           209:                                                    (car j))))))
        !           210:                           ((null v-root)
        !           211:                            (setq temr (reverse tem))
        !           212:                            (cond ((and (eq 'l (car temr))
        !           213:                                        (eq '\. (cadr temr)))
        !           214:                                   (setq rootreal nil)
        !           215:                                   (setq v-root (apply 'concat (reverse (cddr temr)))))
        !           216:                                  (t (setq v-root (car i)
        !           217:                                           rootreal t))))
        !           218: 
        !           219:                           (t (comp-gerr "Extra input file name: " (car i)))))
        !           220: 
        !           221: 
        !           222:            (cond (fl-vms (setq fl-tran nil)))  ; no transfer tables in vms
        !           223: 
        !           224:                 ; now see what the arguments have left us
        !           225: 
        !           226:                 (cond ((null v-root)
        !           227:                        (comp-gerr "No file for input"))
        !           228:                       ((or (portp 
        !           229:                             (setq vp-ifile 
        !           230:                                   (car (errset (infile 
        !           231:                                                   (setq v-ifile 
        !           232:                                                         (concat v-root '".l"))) 
        !           233:                                                nil))))
        !           234:                            (and rootreal
        !           235:                                 (portp
        !           236:                                  (setq vp-ifile
        !           237:                                        (car (errset 
        !           238:                                                 (infile (setq v-ifile v-root))
        !           239:                                                 nil)))))))
        !           240:                       (t (comp-gerr "Couldn't open the source file :"
        !           241:                                     (or v-ifile))))
        !           242: 
        !           243: 
        !           244:                 ; determine the name of the .s file
        !           245:                 ; strategy: if fl-asm is t (only assemble) use (v-root).s
        !           246:                 ;           else use /tmp/(PID).s
        !           247:                 ;  
        !           248:                 ; direct asm to tty temporarily
        !           249:                 (setq v-sfile '"tty")
        !           250:                 (setq vp-sfile nil)
        !           251:                 (If (null fl-tty) then
        !           252:                    (cond (fl-asm (setq v-sfile (concat '"/tmp/jkf" 
        !           253:                                                           (boole 1 65535
        !           254:                                                                  (syscall 20))
        !           255:                                                           '".s")))
        !           256:                          (t (setq v-sfile (concat v-root '".s"))))
        !           257: 
        !           258:                   (cond ((not (portp (setq vp-sfile 
        !           259:                                          (car (errset (outfile v-sfile) 
        !           260:                                                       nil)))))
        !           261:                        (comp-gerr "Couldn't open the .s file: "
        !           262:                                   (or v-sfile)))))
        !           263:                                     
        !           264:                 
        !           265:                 ; determine the name of the .o file (object file)
        !           266:                 ; strategy: if we aren't supposed to assemble the .s file
        !           267:                 ;            don't worry about a name
        !           268:                 ;           else if a name is given, use it
        !           269:                 ;           else if use (v-root).o
        !           270:                 ;  if profiling, use .o
        !           271:                 (cond ((or v-ofile (null fl-asm)))             ;ignore
        !           272:                       ((null fl-profile) (setq v-ofile (concat v-root '".o")))
        !           273:                       (t (setq v-ofile (concat v-root ".o"))))
        !           274: 
        !           275:                 ; determine the name of the .x file (xref file)
        !           276:                 ; strategy: if fl-xref is true, then use (v-root).x
        !           277:                 ;
        !           278:                 (cond (fl-xref 
        !           279:                        (cond ((not 
        !           280:                                (portp 
        !           281:                                 (setq vp-xfile 
        !           282:                                      (car (errset (outfile (setq v-xfile 
        !           283:                                                     (concat v-root ".x"))))))))
        !           284:                               (comp-gerr "Can't open the .x file" (or v-xfile))))))
        !           285:                 (cond ((checkfatal) (return 1)))
        !           286: 
        !           287:                 (setq readtable (makereadtable nil))   ; use new readtable
        !           288: 
        !           289: 
        !           290:                 ; if the macsyma flag is set, change the syntax to the
        !           291:                 ; maclisp standard syntax.  We must be careful that we
        !           292:                 ; dont clobber any syntax changes made by files preloaded
        !           293:                 ; into the compiler.
        !           294: 
        !           295:                 (cond (fl-macl (setsyntax '\/ 143)     ;  143 = vesc
        !           296: 
        !           297:                                (cond ((equal 143 (status syntax \\))
        !           298:                                       (setsyntax '\\ 2)))
        !           299: 
        !           300:                                (setsyntax '\| 138)     ;  138 = vdq
        !           301:                                (cond ((equal 198 (status syntax \[))
        !           302:                                       (setsyntax '\[ 2)
        !           303:                                       (setsyntax '\] 2)))
        !           304:                                (setq ibase  8.)
        !           305:                                (sstatus uctolc t)
        !           306:                                
        !           307:                                (d-makespec 'ibase)     ; to be special
        !           308:                                (d-makespec 'base)
        !           309:                                (d-makespec 'tty)
        !           310: 
        !           311:                                (errset (cond ((null (getd 'macsyma-env))
        !           312:                                               (fasl '/usr/lib/lisp/machacks)))
        !           313:                                        nil))
        !           314:                       (fl-uci (load "/usr/lib/lisp/ucifnc")
        !           315:                               (cvttoucilisp)))
        !           316: 
        !           317:                 (cond (fl-inter (putprop '* 'cc-ignore 'fl-exprcc) ;comment
        !           318:                                 (remprop '* 'fl-expr)
        !           319:                                 ))
        !           320: 
        !           321:                 (cond ((checkfatal) (return 1)))  ; leave if fatal errors      
        !           322: 
        !           323:                 (comp-note "Compilation begins with " compiler-name)
        !           324:                 (comp-note "source: "  v-ifile ", result: "
        !           325:                            (cond (fl-asm v-ofile) (t v-sfile)))
        !           326:                 (setq piport vp-ifile)         ; set to standard input
        !           327:                 (setq liszt-root-name v-root
        !           328:                       liszt-file-name v-ifile)
        !           329: 
        !           330: 
        !           331:                 (If fl-profile then (e-write1 '".globl mcount"))
        !           332:        loop
        !           333: 
        !           334:                (cond ((atom (errset            ; list for debugging,
        !           335:                                                ; errset for production.
        !           336:                              (do ((i (read piport '<<end-of-file>>) 
        !           337:                                      (read piport '<<end-of-file>>))) 
        !           338:                                  ((eq i '<<end-of-file>>) nil)
        !           339:                                  (catch (liszt-form i) Comp-error))))
        !           340:                       (comp-note "Lisp error during compilation")
        !           341:                       (setq piport nil)
        !           342:                       (setq er-fatal (1+ er-fatal))
        !           343:                       (return 1)))
        !           344: 
        !           345:                 (close piport)
        !           346: 
        !           347:                 (cond ((checkfatal) (return 1)))
        !           348:                        
        !           349:                 ; if doing special character stuff (maclisp) reassert
        !           350:                 ; the state
        !           351: 
        !           352:                 (cond (vps-include
        !           353:                        (comp-note  " done include")
        !           354:                        (setq piport (car vps-include))
        !           355:                        (setq vps-include (cdr vps-include))
        !           356:                        (go loop)))
        !           357: 
        !           358:                 (cond (liszt-eof-forms
        !           359:                        (do ((ll liszt-eof-forms (cdr ll)))
        !           360:                            ((null ll))
        !           361:                            (cond ((atom (errset (liszt-form (car ll))))
        !           362:                                   (comp-note "Lisp error during eof forms")
        !           363:                                   (setq piport nil)
        !           364:                                   (return 1))))))
        !           365: 
        !           366:                 ; reset input base
        !           367:                 (setq ibase 10.)
        !           368:                 (setq readtable (makereadtable t))
        !           369:                 (d-bindtab)
        !           370: 
        !           371: 
        !           372:                 (close vp-sfile)               ; close assembler language file
        !           373:                 (comp-note "Compilation complete")
        !           374: 
        !           375:                 (setq tem (Divide (difference (syscall 13) starttime) 60))
        !           376:                 (comp-note " Real time: " (car tem) " minutes, "
        !           377:                            (cadr tem) " seconds")
        !           378:                 (setq tem (ptime))
        !           379:                 (setq temr (Divide (difference (car tem) (car startptime))
        !           380:                                    3600))
        !           381:                 (comp-note " CPU time: " (car temr) " minutes, "
        !           382:                            (quotient (cadr temr) 60.0) " seconds")
        !           383:                 (setq temr (Divide (difference (cadr tem) (cadr startptime))
        !           384:                                    3600))
        !           385:                 (comp-note " of which " (car temr) " minutes and "
        !           386:                            (quotient (cadr temr) 60.0) 
        !           387:                            " seconds were for the "
        !           388:                            (difference $gccount$ startgccount)
        !           389:                            " gcs which were done")
        !           390: 
        !           391:                 (cond (fl-xref
        !           392:                        (comp-note "Cross reference being generated")
        !           393:                        (print (list 'File v-ifile) vp-xfile)
        !           394:                        (terpr vp-xfile)
        !           395:                        (do ((ii g-allf (cdr ii)))
        !           396:                            ((null ii))
        !           397:                            (print (car ii) vp-xfile)
        !           398:                            (terpr vp-xfile))
        !           399:                        (close vp-xfile)))
        !           400: 
        !           401: 
        !           402:                 ; the assember we use must generate the new a.out format
        !           403:                 ; with a string table.  We will assume that the assembler
        !           404:                 ; is in /usr/lib/lisp/as so that other sites can run
        !           405:                 ; the new assembler without installing the new assembler
        !           406:                 ; as /bin/as
        !           407:                 (cond (fl-asm                  ; assemble file 
        !           408:                         (comp-note "Assembly begins")
        !           409:                         (cond ((not 
        !           410:                                 (zerop 
        !           411:                                    (setq tmp
        !           412:                                          (apply 'process 
        !           413:                                                 (ncons (concat 
        !           414:                                                         "/usr/lib/lisp/as  -o "
        !           415:                                                                    v-ofile
        !           416:                                                                    '" "
        !           417:                                                                    v-sfile))))))
        !           418:                                (comp-gerr "Assembler detected error, code: "
        !           419:                                           tmp)
        !           420:                                (comp-note "Assembler temp file " v-sfile
        !           421:                                           " is not unlinked"))
        !           422:                               (t (comp-note "Assembly completed successfully")
        !           423:                                  (syscall 10 v-sfile)))))  ; unlink tmp file
        !           424: 
        !           425:                 (setq readtable original-readtable)
        !           426:                 #+monitoring
        !           427:                 (errset (progn (monitor)       ; turn off monitoring
        !           428:                                (print 'monitor-off))
        !           429:                         nil)
        !           430:                 (return 0))))
        !           431: 
        !           432: (def checkfatal
        !           433:   (lambda nil
        !           434:          (cond ((greaterp er-fatal 0)
        !           435:                 (comp-note "Compilation aborted")
        !           436:                 t))))
        !           437: 
        !           438: ;--- liszt-form - i : form to compile
        !           439: ;      This compiles one form.
        !           440: ;
        !           441: (def liszt-form
        !           442:   (lambda (i)
        !           443:      (prog (tmp v-x)
        !           444:          ; macro expand
        !           445:        loop
        !           446:          (If (and (dtpr i) (eq 'macro (d-functyp (car i))))
        !           447:              then (setq i (apply (car i) i))
        !           448:                   (go loop))
        !           449:          ; now look at what is left
        !           450:          (cond ((eq (car i) 'def) ; jkf mod
        !           451:                 (cond (fl-verb (print (cadr i)) (terpr)(drain)))
        !           452:                 (d-dodef i))
        !           453:                ((eq (car i) 'declare) (funcall 'complr-declare  (cdr i)))
        !           454:                ((eq (car i) 'eval-when) (doevalwhen i))
        !           455:                ((and (eq (car i) 'progn) (equal (cadr i) '(quote compile)))
        !           456:                 ((lambda (internal-macros)     ; compile macros too
        !           457:                          (mapc 'liszt-form (cddr i)))
        !           458:                       t))
        !           459:                ((or (and (eq (car i) 'includef) (setq tmp (eval (cadr i))))
        !           460:                     (and (eq (car i) 'include ) (setq tmp (cadr i))))
        !           461:                 (cond ((or (portp (setq v-x 
        !           462:                                         (car (errset (infile tmp) nil))))
        !           463:                            (portp (setq v-x 
        !           464:                                         (car (errset (infile (concat '"/usr/lib/lisp"
        !           465:                                                             tmp)) 
        !           466:                                                      nil))))
        !           467:                            (portp (setq v-x 
        !           468:                                         (car (errset (infile (concat tmp
        !           469:                                                                      '".l")) 
        !           470:                                                      nil)))))
        !           471:                        (setq vps-include (cons piport vps-include))
        !           472:                        (setq piport v-x)
        !           473:                        (comp-note " INCLUDEing file: "  tmp))
        !           474:                       (t (comp-gerr "Cannot open include file: " tmp))))
        !           475:                ((eq (car i) 'comment) nil)   ; just ignore comments
        !           476:                (t (Push g-funcs `(eval ,i)))))))
        !           477: 
        !           478: ;--- d-dodef :: handle the def form
        !           479: ;      - form : a def form: (def name (type args . body))
        !           480: ;
        !           481: (defun d-dodef (form)
        !           482:   (prog nil
        !           483: 
        !           484:     loop
        !           485: 
        !           486:        (let ( ((g-fname (g-ftype g-args . body)) (cdr form))
        !           487:               (lambdaform (caddr form))
        !           488:               (symlab (gensym 'F)))
        !           489:             (If (or (memq '&rest g-args) 
        !           490:                     (memq '&optional g-args)
        !           491:                     (memq '&aux g-args))
        !           492:                 then (setq form 
        !           493:                            `(def ,(cadr form) ,(lambdacvt (cdr lambdaform))))
        !           494:                      (go loop))
        !           495:             (If (null (atom g-fname))
        !           496:                 then (comp-err "bad function name")
        !           497:                 else (setq g-flocal (get g-fname g-localf))
        !           498:                      (If (eq g-ftype 'macro)
        !           499:                          then (eval form)
        !           500:                               (If (and (null macros)
        !           501:                                        (null internal-macros))
        !           502:                                   then (comp-note " macro will not be compiled")
        !           503:                                        (return nil))
        !           504:                               (Push g-funcs `(macro ,symlab ,g-fname))
        !           505:                       elseif g-flocal
        !           506:                          then (If (null (or (eq g-ftype 'lambda)
        !           507:                                             (eq g-ftype 'nlambda)))
        !           508:                                   then (comp-err "bad type for fcn" (or g-ftype)))
        !           509:                       elseif (or (eq g-ftype 'lambda)
        !           510:                                  (eq g-ftype 'lexpr))
        !           511:                          then (Push g-funcs `(lambda ,symlab ,g-fname))
        !           512:                       elseif (eq g-ftype 'nlambda)
        !           513:                          then (Push g-funcs `(nlambda ,symlab ,g-fname))
        !           514:                       else (comp-err " bad function type " g-ftype)))
        !           515:                (setq g-skipcode nil)   ;make sure we aren't skipping code
        !           516:                (forcecomment `(fcn ,g-ftype  ,g-fname))
        !           517:                (If g-flocal 
        !           518:                    then (comp-note "is a local function")
        !           519:                         (e-writel (car g-flocal))
        !           520:                    else
        !           521:                         (If (null fl-vms) then (e-write2 '".globl" symlab))
        !           522:                         (e-writel symlab))
        !           523:                (setq g-locs nil g-loccnt 0 g-labs nil g-loc 'reg g-cc nil
        !           524:                      g-ret t g-topsym (d-genlab))
        !           525:                (If fl-xref then (setq g-refseen (gensym) g-reflst nil))
        !           526:                (d-clearreg)
        !           527:                (Push g-locs (cons 'lambda 0))
        !           528:                (setq g-currentargs (length g-args))
        !           529:                (mapc '(lambda (x) (Push g-locs nil) (incr g-loccnt))
        !           530:                               g-args)
        !           531:                (d-prelude)                     ; do beginning stuff
        !           532:                (d-lambbody lambdaform)         ; emit code
        !           533:                (d-fini)
        !           534:                (If fl-xref then 
        !           535:                    (Push g-allf
        !           536:                          (cons g-fname
        !           537:                                (cons (cond (g-flocal (cons g-ftype 'local))
        !           538:                                            (t g-ftype))
        !           539:                                      g-reflst)))))))
        !           540:  
        !           541: 
        !           542: ;--- d-prelude :: emit code common to beginning of all functions
        !           543: ;
        !           544: (defun d-prelude nil
        !           545:   (If g-flocal
        !           546:       then (e-write3 'movl 'r10 '"-(sp)")      ; (faster than pushl)
        !           547:           (e-write3 'movab `(,(* -4 g-currentargs) r6) 'r10)
        !           548:           (e-writel g-topsym)
        !           549:       else
        !           550:           (e-write2 '".word" '0x5c0)
        !           551:           (If fl-profile
        !           552:               then (e-write3 'movab 'mcounts 'r0)
        !           553:                    (e-write2 'jsb 'mcount))
        !           554:           (e-write3 'movab 'linker '#.bind-reg)
        !           555:           (If (eq g-ftype 'lexpr) 
        !           556:             then 
        !           557:               (e-write4 'subl3 '$4 Lbot-reg '"-(sp)")  ; set up base for (arg)
        !           558:               (e-writel g-topsym)
        !           559:               (e-write3 'movl Np-reg oLbot-reg)        ; will stack num of args
        !           560:               (e-write4 'subl3 Lbot-reg Np-reg 'r0)    ; arg cnt again
        !           561:               (e-write3 'movab '"0x1400(r0)" np-plus)  ; stack lispval
        !           562:               (e-write3 'movl '(0 #.oLbot-reg) '"-(sp)") ; also on runtime stk
        !           563:             else
        !           564:               ; set up old lbot register, base register for variable
        !           565:               ; references
        !           566:               (e-write3 'movl '#.Lbot-reg '#.oLbot-reg)
        !           567:               ; make sure the np register points where it should since
        !           568:               ; the caller might have given too few or too many args
        !           569:               (e-write3 'movab `(,(* 4 g-currentargs) #.oLbot-reg) 
        !           570:                                '#.Np-reg)
        !           571:               (e-writel g-topsym))))
        !           572: 
        !           573: ;--- d-fini :: emit code  at end of function
        !           574: 
        !           575: (defun d-fini nil
        !           576:   (If g-flocal then (e-write3 'movl '"(sp)+" 'r10)
        !           577:                    (e-write1 'rsb)
        !           578:               else (e-return)))
        !           579: 
        !           580: 
        !           581: ;--- d-bindtab :: emit binder table when all functions compiled
        !           582: ;
        !           583: (defun d-bindtab nil
        !           584:   (setq g-skipcode nil)          ; make sure this isnt ignored 
        !           585:   (e-writel "bind_org")
        !           586:   (e-write2 ".set linker_size," (length g-lits))
        !           587:   (e-write2 ".set trans_size," (length g-tran))
        !           588:   (do ((ll (setq g-funcs (nreverse g-funcs)) (cdr ll)))
        !           589:       ((null ll))
        !           590:       (If (memq (caar ll) '(lambda nlambda macro eval))
        !           591:          then (e-write2 '".long" (cdr (assoc (caar ll) 
        !           592:                                              '((lambda . 0)
        !           593:                                                (nlambda . 1)
        !           594:                                                (macro . 2)
        !           595:                                                (eval . 99)))))
        !           596:          else (comp-err " bad type in lit list " (car ll))))
        !           597:   
        !           598:   (e-write1 ".long -1")
        !           599:   (e-write1 '"lit_org:")
        !           600:   (d-asciiout (nreverse g-lits))
        !           601:   (If g-tran then (d-asciiout (nreverse g-tran)))
        !           602:   (d-asciiout (mapcar '(lambda (x) (If (eq (car x) 'eval)
        !           603:                                       then (cadr x)
        !           604:                                       else (caddr x)))
        !           605:                      g-funcs))
        !           606:   
        !           607:   (e-write1 '"lit_end:"))
        !           608: 
        !           609: ;--- d-asciiout :: print a list of asciz strings
        !           610: ;
        !           611: (defun d-asciiout (args)
        !           612:        (do ((lits args (cdr lits))
        !           613:            (form))
        !           614:           ((null lits))
        !           615:           (setq form (explode (car lits))
        !           616:                 formsiz (length form))
        !           617:           (do ((remsiz formsiz)
        !           618:                (curform form)
        !           619:                (thissiz))
        !           620:               ((zerop remsiz))
        !           621:               (If (greaterp remsiz 60) then (sfilewrite '".ascii \"")
        !           622:                   else (sfilewrite '".asciz \""))
        !           623:               (setq thissiz (min 60 remsiz))
        !           624:               (do ((count thissiz (1- count)))
        !           625:                   ((zerop count)
        !           626:                    (sfilewrite (concat '\" (ascii 10)))
        !           627:                    (setq remsiz (difference remsiz thissiz)))
        !           628:                   (If (eq ch-newline (car curform))
        !           629:                       then (sfilewrite '\\012)
        !           630:                    else (If (or (eq '\\ (car curform))
        !           631:                                 (eq '\" (car curform)))
        !           632:                             then (sfilewrite '\\))
        !           633:                         (sfilewrite (car curform)))
        !           634:                   (setq curform (cdr curform))))))
        !           635: 
        !           636: ;--- doevalwhen, process evalwhen directive. This is inadequate.
        !           637: ;
        !           638: (def doevalwhen 
        !           639:       (lambda (v-f)
        !           640:              (prog (docom dolod)
        !           641:                    (setq docom (memq 'compile (cadr v-f))
        !           642:                          
        !           643:                          dolod (memq 'load (cadr v-f)))
        !           644:                    (mapc '(lambda (frm) (cond (docom (eval frm)))
        !           645:                                         (cond (dolod 
        !           646:                                                ((lambda (internal-macros) 
        !           647:                                                         (liszt-form frm))
        !           648:                                                 t))))
        !           649:                          (cddr v-f)))))
        !           650: 
        !           651: 
        !           652: ;---- dodcl - forms declare form
        !           653: ;      process the declare form given. We evaluate each arg
        !           654: ;
        !           655: (defun complr-declare fexpr (forms)
        !           656:          (do ((i forms (cdr i))) 
        !           657:              ((null i))
        !           658:              (cond ((and (atom (caar i))
        !           659:                          (getd (caar i)))
        !           660:                     (eval (car i))) ; if this is a function
        !           661:                    (t (comp-warn "Unknown declare attribute: " (car i))))))
        !           662: 
        !           663: ;---> handlers for declare forms
        !           664: ;
        !           665: (def *fexpr
        !           666:   (nlambda (args)
        !           667:           (mapc '(lambda (v-a)
        !           668:                          (putprop v-a 'nlambda g-functype))
        !           669:                 args)))
        !           670: 
        !           671: (def nlambda
        !           672:   (nlambda (args)
        !           673:           (mapc '(lambda (v-a)
        !           674:                          (putprop v-a 'nlambda g-functype))
        !           675:                 args)))
        !           676: 
        !           677: (def special
        !           678:   (nlambda (v-l) 
        !           679:           (mapc '(lambda (v-a)
        !           680:                          (putprop v-a t g-spec) ) 
        !           681:                 v-l)
        !           682:           t))
        !           683: (def unspecial
        !           684:   (nlambda (v-l) 
        !           685:           (mapc '(lambda (v-a) 
        !           686:                          (putprop v-a nil g-spec)) 
        !           687:                 v-l)
        !           688:           t))
        !           689: 
        !           690: (def *expr 
        !           691:   (nlambda (args) 
        !           692:           (mapc 
        !           693:            '(lambda (v-a)
        !           694:                   (cond ((atom v-a) (putprop v-a 'lambda g-functype))
        !           695:                         (t (comp-warn "Bad declare form " v-a 
        !           696:                                       " in list " args))))
        !           697:            args)
        !           698:           t))
        !           699: 
        !           700: (def *lexpr 
        !           701:   (nlambda (args) 
        !           702:           (mapc '(lambda (v-a)
        !           703:                          (putprop v-a 'lexpr g-functype))
        !           704:                 args)
        !           705:           t))  ; ignore
        !           706: 
        !           707: (def fixnum
        !           708:   (nlambda (args)
        !           709:           nil)) ; ignore
        !           710: 
        !           711: (def flonum
        !           712:   (nlambda (args)
        !           713:           nil)) ; ignore
        !           714: 
        !           715: (def macros 
        !           716:   (nlambda (args) (setq macros (car args))))
        !           717: 
        !           718: (def localf
        !           719:   (nlambda (args) (mapc '(lambda (ar)
        !           720:                                 (If (null (get ar g-localf))
        !           721:                                     then (putprop ar 
        !           722:                                                   (cons (d-genlab) -1)
        !           723:                                                   g-localf)))
        !           724:                        args)))
        !           725: ;---> end declare form handlers
        !           726: 
        !           727: 
        !           728: 
        !           729: 
        !           730: 
        !           731: 
        !           732: 
        !           733: 
        !           734: 
        !           735: ;--- lambdacvt
        !           736: ;      converts a lambda expression with &optional, &rest and &aux forms in
        !           737: ;      the argument list into a lexpr which will do the desired function.
        !           738: ; method of operation
        !           739: ; the argument list is examined and the following lists are made:
        !           740: ;  vbs - list of variables to be lambda bound
        !           741: ;  opl - list of optional forms
        !           742: ;  vals - list of values to be assigned to the vbs
        !           743: ;
        !           744: (def lambdacvt
        !           745:   (lambda (exp)
        !           746:          (prog (arg vbs vals opl rest opflg restflg narg narg2 narg3 auxflg
        !           747:                 avbs)
        !           748:                (do ((ll (car exp) (cdr ll))
        !           749:                     (count 1 (1+ count)))
        !           750:                    ((null ll))
        !           751:                    (cond ((eq '&rest (car ll))
        !           752:                           (setq restflg t opflg nil count (1- count)))
        !           753:                          ((eq '&optional (car ll))
        !           754:                           (setq opflg t   count (1- count)))
        !           755:                          ((eq '&aux (car ll))
        !           756:                           (setq auxflg t 
        !           757:                                 opflg nil 
        !           758:                                 restflg nil 
        !           759:                                 count (1- count)))
        !           760:                          (opflg
        !           761:                           (cond ((atom (setq arg (car ll))) 
        !           762:                                  (setq opl (cons (cons (ncons arg) count) opl)
        !           763:                                        vbs (cons arg vbs)
        !           764:                                        vals (cons nil vals)))
        !           765:                                 ((cddr arg)
        !           766:                                  (setq vbs (cons (car arg) 
        !           767:                                                  (cons (caddr arg)
        !           768:                                                        vbs))
        !           769:                                        vals (cons nil
        !           770:                                                   (cons nil vals))
        !           771:                                        opl (cons (cons arg count) opl)))
        !           772:                                 (t (setq vbs (cons (car arg) vbs)
        !           773:                                          vals (cons nil vals)
        !           774:                                          opl (cons (cons arg count) opl)))))
        !           775:                          (restflg
        !           776:                           (setq vbs (cons (car ll) vbs)
        !           777:                                 vals (cons nil vals)
        !           778:                                 rest (cons (car ll) count)))
        !           779:                          (auxflg
        !           780:                           (setq count (1- count))
        !           781:                           (cond ((atom (setq arg (car ll)))
        !           782:                                  (setq avbs (cons (ncons arg) avbs)))
        !           783:                                 (t (setq avbs (cons arg avbs)))))
        !           784:                          (t (setq vbs (cons (car ll) vbs)
        !           785:                                   vals (cons `(arg ,count) vals)))))
        !           786:                (setq narg (gensym))
        !           787:                
        !           788:                (return
        !           789:                 `(lexpr (,narg)
        !           790:                     ((lambda ,(nreverse vbs)
        !           791:                              ,@(mapcar 
        !           792:                                 '(lambda (arg)
        !           793:                                          `(cond ((greaterp ,(cdr arg)
        !           794:                                                            ,narg)
        !           795:                                                  ,@(cond ((cadar arg)
        !           796:                                                           `((setq ,(caar arg) 
        !           797:                                                                   ,(cadar arg))))))
        !           798:                                                 (t (setq ,(caar arg) (arg ,(cdr arg))) 
        !           799:                                                    ,@(cond ((cddar arg)
        !           800:                                                             `((setq ,(caddar arg)
        !           801:                                                                    t)))))))
        !           802:                                 (nreverse opl))
        !           803:                              ,@(cond (rest (setq narg2 (gensym)
        !           804:                                                  narg3 (gensym))
        !           805:                                            `((do ((,narg2 ,narg (1- ,narg2))
        !           806:                                                  (,narg3 nil (cons (arg ,narg2)
        !           807:                                                                    ,narg3)))
        !           808:                                                 ((lessp ,narg2 ,(cdr rest))
        !           809:                                                  (setq ,(car rest) ,narg3))))))
        !           810:                              ,@(cond (auxflg `((let* ,(nreverse avbs)
        !           811:                                                      ,@(cdr exp))))
        !           812:                                      (t (cdr exp))))
        !           813:                      ,@(nreverse vals)))))))
        !           814: 
        !           815: ; this routine is copied from ccb.l so we can make it a local function
        !           816: ; in both files
        !           817: 
        !           818: ;--- d-genlab :: generate a pseudo label
        !           819: ;
        !           820: (defun d-genlab nil
        !           821:   (gensym 'L))
        !           822: 

unix.superglobalmegacorp.com

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