Annotation of 42BSD/ucb/lisp/lisplib/toplevel.l, revision 1.1

1.1     ! root        1: (setq rcs-toplevel-
        !             2:    "$Header: toplevel.l,v 1.5 83/09/04 10:20:41 jkf Exp $")
        !             3: 
        !             4: ;;
        !             5: ;; toplevel.l                          -[Mon Aug 22 13:24:43 1983 by jkf]-
        !             6: ;;
        !             7: ;;  toplevel read eval print loop
        !             8: ;;
        !             9: 
        !            10: 
        !            11: ; special atoms:
        !            12: (declare (special debug-level-count break-level-count
        !            13:                  errlist tpl-errlist user-top-level
        !            14:                  franz-not-virgin piport ER%tpl ER%all
        !            15:                  $ldprint evalhook funcallhook
        !            16:                  franz-minor-version-number
        !            17:                  top-level-init
        !            18:                  top-level-prompt top-level-read
        !            19:                  top-level-eval top-level-print
        !            20:                  top-level-eof * ** *** + ++ +++ ^w)
        !            21:          (localf autorunlisp cvtsearchpathtolist)
        !            22:         (macros t))
        !            23: 
        !            24: (setq top-level-eof (gensym 'Q)
        !            25:       tpl-errlist nil
        !            26:       errlist nil
        !            27:       user-top-level nil
        !            28:       top-level-init nil
        !            29:       top-level-prompt nil
        !            30:       top-level-read  nil
        !            31:       top-level-eval nil
        !            32:       top-level-print nil)
        !            33: 
        !            34: ;--- initialization, prompt, read, eval, and print functions are
        !            35: ; user-selectable by just assigning another value to top-level-init,
        !            36: ; top-level-prompt, top-level-read, top-level-eval, and top-level-print.
        !            37: ;
        !            38: (defmacro top-init nil
        !            39:    '(cond ((and top-level-init
        !            40:                (getd top-level-init))
        !            41:           (funcall top-level-init))
        !            42:          (t (cond ((not (autorunlisp))
        !            43:                    (patom (status version))
        !            44:                    ; franz-minor-version-number defined in version.l
        !            45:                    (cond ((boundp 'franz-minor-version-number)
        !            46:                           (patom franz-minor-version-number)))
        !            47:                    (terpr)
        !            48:                    (read-in-lisprc-file))))))
        !            49:      
        !            50: (defmacro top-prompt nil
        !            51:    `(cond ((and top-level-prompt
        !            52:                (getd top-level-prompt))
        !            53:           (funcall top-level-prompt))
        !            54:          (t (patom "-> "))))
        !            55: 
        !            56: (defmacro top-read (&rest args)
        !            57:    `(cond ((and top-level-read
        !            58:                (getd top-level-read))
        !            59:           (funcall top-level-read ,@args))
        !            60:          (t (read ,@args))))
        !            61: 
        !            62: (defmacro top-eval (&rest args)
        !            63:    `(cond ((and top-level-eval
        !            64:                (getd top-level-eval))
        !            65:           (funcall top-level-eval ,@args))
        !            66:          (t (eval ,@args))))
        !            67: 
        !            68: (defmacro top-print (&rest args)
        !            69:    `(cond ((and top-level-print
        !            70:                (getd top-level-print))
        !            71:           (funcall top-level-print ,@args))
        !            72:          (t (print ,@args))))
        !            73: 
        !            74: ;------------------------------------------------------
        !            75: ;  Top level function for franz                        jkf, march 1980
        !            76: ;
        !            77: ; The following function contains the top-level read, eval, print 
        !            78: ; loop.  With the help of the error handling functions, 
        !            79: ; break-err-handler and  debug-err-handler,  franz-top-level provides
        !            80: ; a reasonable enviroment for working with franz lisp.  
        !            81: ; 
        !            82: 
        !            83: (def franz-top-level
        !            84:   (lambda nil
        !            85:      (putd 'reset (getd 'franz-reset))
        !            86:      (username-to-dir-flush-cache)      ; clear tilde expansion knowledge
        !            87:       (cond ((or (not (boundp 'franz-not-virgin))
        !            88:                 (null franz-not-virgin))
        !            89:             (setq franz-not-virgin t
        !            90:                   + nil ++ nil +++ nil
        !            91:                   * nil ** nil *** nil)
        !            92:             (setq ER%tpl 'break-err-handler)
        !            93:             (top-init)))
        !            94:      
        !            95:      ; loop forever
        !            96:      (do ((+*) (-) (retval))
        !            97:         (nil)
        !            98:         (setq retval
        !            99:          (*catch 
        !           100:          '(top-level-catch break-catch)
        !           101:           ; begin or return to top level
        !           102:           (progn
        !           103:              (setq debug-level-count 0   break-level-count 0
        !           104:                   evalhook nil   funcallhook nil)
        !           105:              (cond (tpl-errlist (mapc 'eval tpl-errlist)))
        !           106:             (do ((^w nil nil))
        !           107:                 (nil)
        !           108:                 (cond (user-top-level (funcall user-top-level))
        !           109:                       (t (top-prompt)
        !           110:                          (cond ((eq top-level-eof
        !           111:                                     (setq - 
        !           112:                                           (car (errset (top-read nil 
        !           113:                                                              top-level-eof)))))
        !           114:                                 (cond ((not (status isatty))
        !           115:                                        (exit)))
        !           116:                                 (cond ((null (status ignoreeof))
        !           117:                                        (terpr)
        !           118:                                        (print 'Goodbye)
        !           119:                                        (terpr)
        !           120:                                        (exit))
        !           121:                                       (t (terpr)
        !           122:                                          (setq - ''EOF)))))
        !           123:                          (setq +* (top-eval -))
        !           124:                          ; update list of old forms
        !           125:                          (let ((val -))
        !           126:                               (let ((o+ +) (o++ ++))
        !           127:                                    (setq +   val
        !           128:                                          ++  o+
        !           129:                                          +++ o++)))
        !           130:                          ; update list of old values
        !           131:                          (let ((val +*))
        !           132:                               (let ((o* *) (o** **))
        !           133:                                    (setq *   val
        !           134:                                          **  o*
        !           135:                                          *** o**)))
        !           136:                          (top-print +*)
        !           137:                          (terpr)))))))
        !           138:         (terpr)
        !           139:         (patom "[Return to top level]")
        !           140:         (terpr)
        !           141:         (cond ((eq 'reset retval) (old-reset-function))))))
        !           142: 
        !           143: 
        !           144: 
        !           145: 
        !           146: 
        !           147: ; debug-err-handler is the clb of ER%all when we are doing debugging
        !           148: ; and we want to catch all errors.
        !           149: ; It is just a read eval print loop with errset.
        !           150: ; the only way to leave is: 
        !           151: ;   (reset) just back to top level
        !           152: ;   (return x) return the value to the error checker. 
        !           153: ;              if nil is returned then we will continue as if the error
        !           154: ;              didn't occur. Otherwise if the returned value is a list,
        !           155: ;              then if the error is continuable, the car of that list
        !           156: ;              will be returned to recontinue computation.
        !           157: ;   ^D continue as if this handler wasn't called.
        !           158: ; the form of errmsgs is:
        !           159: ;  (error_type unique_id continuable message_string other_args ...)
        !           160: ;
        !           161: (def debug-err-handler
        !           162:    (lexpr (n)
        !           163:          ((lambda (message debug-level-count retval ^w piport)
        !           164:              (cond ((greaterp n 0)
        !           165:                     (print 'Error:)
        !           166:                     (mapc '(lambda (a) (patom " ") (patom a) )
        !           167:                           (cdddr (arg 1)))
        !           168:                     (terpr)))
        !           169:              (setq ER%all 'debug-err-handler)
        !           170:              (do ((retval)) (nil)
        !           171:                  (cond ((dtpr
        !           172:                            (setq retval
        !           173:                                  (errset
        !           174:                                     (do ((form)) (nil)
        !           175:                                         (patom "D<")
        !           176:                                         (patom debug-level-count)
        !           177:                                         (patom ">: ")
        !           178:                                         (cond ((eq top-level-eof
        !           179:                                                    (setq form
        !           180:                                                          (top-read nil
        !           181:                                                                top-level-eof)))
        !           182:                                                (cond ((null (status isatty))
        !           183:                                                       (exit)))
        !           184:                                                (return nil))
        !           185:                                               ((and (dtpr form)
        !           186:                                                     (eq 'return
        !           187:                                                         (car form)))
        !           188:                                                (return (eval (cadr form))))
        !           189:                                               (t (setq form (top-eval form))
        !           190:                                                  (top-print form)
        !           191:                                                  (terpr)))))))
        !           192:                         (return (car retval))))))
        !           193:           nil
        !           194:           (add1 debug-level-count)
        !           195:           nil
        !           196:           nil
        !           197:           nil)))
        !           198: 
        !           199: ; this is the break handler, it should be tied to 
        !           200: ; ER%tpl always.
        !           201: ; it is entered if there is an error which no one wants to handle.
        !           202: ; We loop forever, printing out our error level until someone
        !           203: ; types a ^D which goes to the next break level above us (or the 
        !           204: ; top-level if there are no break levels above us.
        !           205: ; a (return n) will return that value to the error message
        !           206: ; which called us, if that is possible (that is if the error is
        !           207: ; continuable)
        !           208: ;
        !           209: (def break-err-handler
        !           210:    (lexpr (n)
        !           211:      ((lambda (message break-level-count retval rettype ^w piport)
        !           212:         (cond ((greaterp n 0)
        !           213:                (print 'Error:)
        !           214:                (mapc '(lambda (a) (patom " ") (patom a) )
        !           215:                      (cdddr (arg 1)))
        !           216:                (terpr)
        !           217:                (cond ((caddr (arg 1)) (setq rettype 'contuab))
        !           218:                      (t (setq rettype nil))))
        !           219:               (t (setq rettype 'localcall)))
        !           220: 
        !           221:         (do nil (nil)
        !           222:             (cond ((dtpr
        !           223:                       (setq retval
        !           224:                             (*catch 'break-catch
        !           225:                                 (do ((form)) (nil)
        !           226:                                     (patom "<")
        !           227:                                     (patom break-level-count)
        !           228:                                     (patom ">: ")
        !           229:                                     (cond ((eq top-level-eof
        !           230:                                                (setq form
        !           231:                                                      (top-read
        !           232:                                                         nil
        !           233:                                                         top-level-eof)))
        !           234:                                            (cond ((null (status isatty))
        !           235:                                                   (exit)))
        !           236:                                            (eval 1)    ; force interrupt check
        !           237:                                            (return (sub1 break-level-count)))
        !           238:                                           ((and (dtpr form)
        !           239:                                                 (eq 'return (car form)))
        !           240:                                            (cond ((or (eq rettype 'contuab)
        !           241:                                                       (eq rettype 'localcall))
        !           242:                                                   (return (ncons (top-eval (cadr form)))))
        !           243:                                                  (t (patom "Can't continue from this error")
        !           244:                                                     (terpr))))
        !           245:                                           ((and (dtpr form) (eq 'retbrk (car form)))
        !           246:                                            (cond ((numberp (setq form (top-eval (cadr form))))
        !           247:                                                   (return form))
        !           248:                                                  (t (return (sub1 break-level-count)))))
        !           249:                                           (t (setq form (top-eval form))
        !           250:                                              (top-print form)
        !           251:                                              (terpr)))))))
        !           252:                    (return (cond ((eq rettype 'localcall)
        !           253:                                   (car retval))
        !           254:                                  (t retval))))
        !           255:                   ((lessp retval break-level-count)
        !           256:                    (setq tpl-errlist errlist)
        !           257:                    (*throw 'break-catch retval))
        !           258:                   (t (terpr)))))
        !           259:       nil
        !           260:       (add1 break-level-count)
        !           261:       nil
        !           262:       nil
        !           263:       nil
        !           264:       nil)))
        !           265: 
        !           266: (defvar debug-error-handler 'debug-err-handler) ; name of function to get
        !           267:                                                ; control on ER%all error
        !           268: (def debugging 
        !           269:   (lambda (val)
        !           270:          (cond (val (setq ER%all debug-error-handler)
        !           271:                     (sstatus translink nil)
        !           272:                     (*rset t))
        !           273:                (t (setq ER%all nil)))))
        !           274: 
        !           275: 
        !           276: ; the problem with this definition for break is that we are
        !           277: ; forced to put an errset around the break-err-handler. This means
        !           278: ; that we will never get break errors, since all errors will be
        !           279: ; caught by our errset (better ours than one higher up though).
        !           280: ; perhaps the solution is to automatically turn debugmode on.
        !           281: ;
        !           282: (defmacro break (message &optional (pred t))
        !           283:   `(*break ,pred ',message))
        !           284: 
        !           285: (def *break
        !           286:   (lambda (pred message)
        !           287:      (let ((^w nil))
        !           288:          (cond ((not (boundp 'break-level-count)) (setq break-level-count 1)))
        !           289:          (cond (pred (terpr)
        !           290:                      (patom "Break ")
        !           291:                      (patom message)
        !           292:                      (terpr)
        !           293:                      (do ((form))
        !           294:                          (nil)
        !           295:                          (cond ((dtpr (setq form (errset (break-err-handler))))
        !           296:                                 (return (car form))))))))))
        !           297: 
        !           298: 
        !           299: ; this reset function is designed to work with the franz-top-level.
        !           300: ; When franz-top-level begins, it makes franz-reset be reset. 
        !           301: ; when a reset occurs now, we set the global variable tpl-errlist to 
        !           302: ; the current value of errlist and throw to top level.  At top level,
        !           303: ; then tpl-errlist will be evaluated.
        !           304: ;
        !           305: (def franz-reset
        !           306:   (lambda nil
        !           307:          (setq tpl-errlist errlist)
        !           308:          (errset (*throw 'top-level-catch 'reset)
        !           309:                  nil)
        !           310:          (old-reset-function)))
        !           311: 
        !           312: 
        !           313: (declare (special $ldprint))
        !           314: 
        !           315: ;--- read-in-lisprc-file
        !           316: ; search for a lisp init file.  Look first in . then in $HOME
        !           317: ; look first for .o , then .l and then "",
        !           318: ; look for file bodies .lisprc and then lisprc
        !           319: ; 
        !           320: (def read-in-lisprc-file
        !           321:    (lambda nil
        !           322:       (setq break-level-count 0        ; do this in case break
        !           323:            debug-level-count 0)   ; occurs during readin
        !           324:       (*catch '(break-catch top-level-catch)
        !           325:              (do ((dirs `("." ,(getenv 'HOME)) (cdr dirs))
        !           326:                   ($ldprint nil $ldprint))     ; prevent messages
        !           327:                  ((null dirs))
        !           328:                  (cond ((do ((name '(".lisprc" "lisprc") (cdr name)))
        !           329:                             ((null name))
        !           330:                             (cond ((do ((ext '(".o" ".l" "") (cdr ext))
        !           331:                                         (file))
        !           332:                                        ((null ext))
        !           333:                                        (cond ((probef
        !           334:                                                  (setq file
        !           335:                                                        (concat (car dirs)
        !           336:                                                                "/"
        !           337:                                                                (car name)
        !           338:                                                                (car ext))))
        !           339:                                               (cond ((atom (errset (load file)))
        !           340:                                                      (patom
        !           341:                                                         "Error loading lisp init file ")
        !           342:                                                      (print file)
        !           343:                                                      (terpr)
        !           344:                                                      (return 'error)))
        !           345:                                               (return t))))
        !           346:                                    (return t))))
        !           347:                         (return t)))))))
        !           348: 
        !           349: (putd 'top-level (getd 'franz-top-level))
        !           350: 
        !           351: ; if this is the first time this file has been read in, then 
        !           352: ; make franz-reset be the reset function, but remember the original
        !           353: ; reset function as old-reset-function.  We need the old reset function
        !           354: ; if we are going to allow the user to change top-levels, for in 
        !           355: ; order to do that we really have to jump all the way up to the top.
        !           356: (cond ((null (getd 'old-reset-function))
        !           357:        (putd 'old-reset-function (getd 'reset))))
        !           358: 
        !           359: 
        !           360: ;---- autoloader functions
        !           361: 
        !           362: (def undef-func-handler
        !           363:   (lambda (args)
        !           364:     (prog (funcnam file)
        !           365:          (setq funcnam (caddddr args))
        !           366:          (cond ((symbolp funcnam) 
        !           367:                 (cond ((setq file (or (get funcnam 'autoload)
        !           368:                                       (get funcnam 'macro-autoload)))
        !           369:                        (cond ($ldprint
        !           370:                               (patom "[autoload ") (patom file)
        !           371:                               (patom "]")(terpr)))
        !           372:                        (load file))
        !           373:                       (t (return nil)))
        !           374:                 (cond ((getd funcnam) (return (ncons funcnam)))
        !           375:                       (t (patom "Autoload file " ) (print file)
        !           376:                          (patom " does not contain function ")
        !           377:                          (print funcnam)
        !           378:                          (terpr)
        !           379:                          (return nil))))))))
        !           380: 
        !           381: (setq ER%undef 'undef-func-handler)
        !           382: 
        !           383: (declare (special $ldprint))
        !           384: ;--- autorunlisp :: check if this lisp is supposed to run a program right
        !           385: ; away.
        !           386: ;
        !           387: (defun autorunlisp nil
        !           388:   (cond ((and (> (argv -1) 2) (equal (argv 1) '-f))
        !           389:         (let ((progname (argv 2))
        !           390:               ($ldprint nil)
        !           391:               (searchlist nil))        ; don't give fasl messages
        !           392:              (setq searchlist (cvtsearchpathtolist (getenv 'PATH)))
        !           393:              ; give two args to load to insure that a fasl is done.
        !           394:              (cond ((null 
        !           395:                      (errset (load-autorunobject progname searchlist)))
        !           396:                     (exit 0))
        !           397:                    (t t))))))
        !           398: 
        !           399: 
        !           400: (defun cvtsearchpathtolist (path)
        !           401:   (do ((x (explodec path) (cdr x))
        !           402:        (names nil)
        !           403:        (cur nil))
        !           404:       ((null x) 
        !           405:        (nreverse names))
        !           406:       (cond ((or (eq ': (car x)) 
        !           407:                 (and (null (cdr x)) (setq cur (cons (car x) cur))))
        !           408:             (cond (cur (setq names (cons (implode (nreverse cur))
        !           409:                                          names))
        !           410:                        (setq cur nil))
        !           411:                   (t (setq names (cons '|.| names)))))
        !           412:            (t (setq cur (cons (car x) cur))))))
        !           413: 
        !           414: (defun load-autorunobject (name search)
        !           415:   (cond ((memq (getchar name 1) '(/ |.|))
        !           416:         (cond ((probef name) (fasl name))
        !           417:               (t (error "From lisp autorun: can't find file to load"))))
        !           418:        (t (do ((xx search (cdr xx))
        !           419:                (fullname))
        !           420:               ((null xx) (error "Can't find file to execute "))
        !           421:               (cond ((probef (setq fullname (concat (car xx) "/" name)))
        !           422:                      (return (fasl-a-file fullname nil nil))))))))
        !           423: 
        !           424: ;--- command-line-args :: return a list of the command line arguments
        !           425: ; The list does not include the name of the program being executed (argv 0).
        !           426: ; It also doesn't include the autorun flag and arg.
        !           427: ;
        !           428: (defun command-line-args ()
        !           429:    (do ((res nil (cons (argv i) res))
        !           430:        (i (1- (argv -1)) (1- i)))
        !           431:        ((<& i 1)
        !           432:        (if (and (eq '-f (car res))
        !           433:                 (cdr res))
        !           434:           then (cddr res)
        !           435:           else res))))
        !           436: 
        !           437: (defun debug fexpr (args)
        !           438:   (load 'fix)  ; load in fix package
        !           439:   (eval (cons 'debug args)))   ; enter debug through eval
        !           440: 
        !           441: ;-- default autoloader properties
        !           442: 
        !           443: (putprop 'trace (concat lisp-library-directory "/trace") 'autoload)
        !           444: (putprop 'untrace (concat lisp-library-directory "/trace") 'autoload)
        !           445: 
        !           446: (putprop 'step (concat lisp-library-directory "/step") 'autoload)
        !           447: (putprop 'editf (concat lisp-library-directory "/cmuedit") 'autoload)
        !           448: (putprop 'editv (concat lisp-library-directory "/cmuedit") 'autoload)
        !           449: (putprop 'editp (concat lisp-library-directory "/cmuedit") 'autoload)
        !           450: (putprop 'edite (concat lisp-library-directory "/cmuedit") 'autoload)
        !           451: 
        !           452: (putprop 'defstruct (concat lisp-library-directory "/struct") 'macro-autoload)
        !           453: (putprop 'defstruct-expand-ref-macro
        !           454:         (concat lisp-library-directory "/struct") 'autoload)
        !           455: (putprop 'defstruct-expand-cons-macro
        !           456:         (concat lisp-library-directory "/struct") 'autoload)
        !           457: (putprop 'defstruct-expand-alter-macro
        !           458:          (concat lisp-library-directory "/struct") 'autoload)
        !           459: 
        !           460: (putprop 'loop      (concat lisp-library-directory "/loop")   'macro-autoload)
        !           461: (putprop 'defflavor
        !           462:         (concat lisp-library-directory "/flavors") 'macro-autoload)
        !           463: (putprop 'defflavor1
        !           464:         (concat lisp-library-directory "/flavors") 'autoload)
        !           465: 
        !           466: (putprop 'format (concat lisp-library-directory "/format") 'autoload)
        !           467: (putprop 'ferror (concat lisp-library-directory "/format") 'autoload)
        !           468: 
        !           469: (putprop 'make-hash-table
        !           470:         (concat lisp-library-directory "/hash") 'autoload)
        !           471: (putprop 'make-equal-hash-table
        !           472:         (concat lisp-library-directory "/hash") 'autoload)
        !           473: 
        !           474: (putprop 'describe (concat lisp-library-directory "/describe") 'autoload)
        !           475: 
        !           476: (putprop 'cgol (concat lisp-library-directory "/cgol/cgoll")   'autoload)
        !           477: (putprop 'cgolprint (concat lisp-library-directory "/cgol/cgp")   'autoload)
        !           478: 
        !           479: ; probably should be in franz so we don't have to autoload
        !           480: (putprop 'displace  (concat lisp-library-directory "/machacks")   'autoload)

unix.superglobalmegacorp.com

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