Annotation of 43BSDReno/pgrm/lisp/pearl/ucisubset.l, revision 1.1

1.1     ! root        1: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ucisubset.l ;;;;;;;;;;;;;;;;;;;;;;;;;
        !             2: ; Functions for a subset of UCI Lisp that are either used by PEARL
        !             3: ;     or were needed by PEARL users at Berkeley.
        !             4: ; This was purposely designed to interfere as little as necessary
        !             5: ;     with Franz Lisp, so things like the standard UCI do macro
        !             6: ;     and the Charniak (et al) let macro are not provided.
        !             7: ; Includes what used to be sprint.l (at the end).
        !             8: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !             9: ; Copyright (c) 1983 ,  The Regents of the University of California.
        !            10: ; All rights reserved.  
        !            11: ; Authors: Joseph Faletti and Michael Deering.
        !            12: 
        !            13: (eval-when (compile)
        !            14:   (declare (special defmacro-for-compiling *savedefs*))
        !            15:   (setq defmacro-for-compiling t)
        !            16:   (setq *savedefs* nil))
        !            17: 
        !            18: (declare (macros t))
        !            19: 
        !            20: (defvar poport)
        !            21: (defvar pparm1 50)
        !            22: (defvar pparm2 100)
        !            23: (defvar lpar)
        !            24: (defvar rpar)
        !            25: (defvar form)
        !            26: (defvar linel)
        !            27: (defvar *outport* nil)
        !            28: (defvar *fileopen*)
        !            29: (defvar prettyprops '((comment . pp-comment)
        !            30:                      (function . pp-function)
        !            31:                      (value . pp-value)))
        !            32: 
        !            33: (declare (localf *patom1))
        !            34: 
        !            35: (defvar *file* nil)
        !            36: (defvar *oldfunctiondefinition*)
        !            37: (defvar *savedefs* t)
        !            38: 
        !            39: (defmacro funl (&rest rest)
        !            40:   `(function (lambda .,rest)))
        !            41: 
        !            42: ;
        !            43: ; ucilisp (de df dm) declare function macros.
        !            44: ;
        !            45: ; (DE name args body) -> declare exprs and lexprs.
        !            46: ;   If *savedefs* is t and function has previous definition,
        !            47: ;   save it under the property OLDDEF, and return '(name Redefined).
        !            48: ;   Otherwise, just do a defun and return name (as with defun).
        !            49: ;
        !            50: (defun de macro (l)
        !            51:   (cond (*savedefs*
        !            52:         `(progn 'compile
        !            53:                 (setq *oldfunctiondefinition* (getd ',(cadr l)))
        !            54:                 (defun .,(cdr l))
        !            55:                 (and *file*
        !            56:                      (putprop ',(cadr l) *file* 'sourcefile))
        !            57:                 (cond (*oldfunctiondefinition*
        !            58:                        (putprop ',(cadr l) *oldfunctiondefinition* 'olddef)
        !            59:                        (list ',(cadr l) 'Redefined))
        !            60:                       ( t ',(cadr l)))))
        !            61:        ( t `(defun .,(cdr l)))))
        !            62:   
        !            63: ;
        !            64: ; (df name args body) -> declare fexprs.
        !            65: ;
        !            66: (defun df macro (l) 
        !            67:   (cond (*savedefs*
        !            68:         `(progn 'compile
        !            69:                 (setq *oldfunctiondefinition* (getd ',(cadr l)))
        !            70:                 (defun ,(cadr l) fexpr .,(cddr l))
        !            71:                 (and *file*
        !            72:                      (putprop ',(cadr l) *file* 'sourcefile))
        !            73:                 (cond (*oldfunctiondefinition*
        !            74:                        (putprop ',(cadr l) *oldfunctiondefinition* 'olddef)
        !            75:                        (list ',(cadr l) 'Redefined))
        !            76:                       ( t ',(cadr l)))))
        !            77:        ( t `(defun ,(cadr l) fexpr .,(cddr l)))))
        !            78: 
        !            79: ;
        !            80: ; macro's are not compiled except under the same
        !            81: ;      conditions as in franz lisp.
        !            82: ;      (usually just do (declare (macros t))
        !            83: ;              to have macros also compiled).
        !            84: ;
        !            85: ;
        !            86: ; (dm name args body) -> declare macros. same as (defun name 'macro body)
        !            87: ;
        !            88: (defun dm macro (l) 
        !            89:   (cond (*savedefs*
        !            90:         `(progn 'compile
        !            91:                 (setq *oldfunctiondefinition* (getd ',(cadr l)))
        !            92:                 (defun ,(cadr l) macro .,(cddr l))
        !            93:                 (and *file*
        !            94:                      (putprop ',(cadr l) *file* 'sourcefile))
        !            95:                 (cond (*oldfunctiondefinition*
        !            96:                        (putprop ',(cadr l) *oldfunctiondefinition* 'olddef)
        !            97:                        (list ',(cadr l) 'Redefined))
        !            98:                       ( t ',(cadr l)))))
        !            99:        ( t `(defun ,(cadr l) macro .,(cddr l)))))
        !           100: 
        !           101: ; UCI Lisp character macros are non-separating when occurring in 
        !           102: ;    the middle of atoms.
        !           103: (eval-when (compile load eval)
        !           104:   (add-syntax-class 'vucisplicemacro
        !           105:                    '(csplicing-macro escape-when-first))
        !           106:   (add-syntax-class 'vucireadmacro
        !           107:                    '(cmacro escape-when-first)))
        !           108: 
        !           109: ;
        !           110: ; ucilisp functions which declare character macros.
        !           111: ;
        !           112: ;
        !           113: ; dsm - declare splicing read macro.
        !           114: ;
        !           115: (defun dsm macro (l) 
        !           116:   (cond (*savedefs*
        !           117:         `(progn 'compile
        !           118:                 (setq *oldfunctiondefinition*
        !           119:                       (and (memq (getsyntax ',(cadr l))
        !           120:                                  '(vucireadmacro vucisplicemacro
        !           121:                                                  vsplicing-macro vmacro))
        !           122:                            (get ',(cadr l) readtable)))
        !           123:                 (eval-when (compile load eval)
        !           124:                            (setsyntax ',(cadr l) 'vucisplicemacro ',(caddr l)))
        !           125:                 
        !           126:                 (and *file*
        !           127:                      (putprop ',(cadr l) *file* 'sourcefile))
        !           128:                 (cond (*oldfunctiondefinition*
        !           129:                        (putprop ',(cadr l) *oldfunctiondefinition* 'oldmacro)
        !           130:                        (list ',(cadr l) 'Redefined))
        !           131:                       ( t ',(cadr l)))))
        !           132:        ( t `(eval-when (compile load eval)
        !           133:                        (setsyntax ',(cadr l) 'vucisplicemacro ',(caddr l))))))
        !           134: 
        !           135: ;
        !           136: ; drm - declare read macro.
        !           137: ;
        !           138: (defun drm macro (l) 
        !           139:   (cond (*savedefs*
        !           140:         `(progn 'compile
        !           141:                 (setq *oldfunctiondefinition*
        !           142:                       (and (memq (getsyntax ',(cadr l))
        !           143:                                  '(vucireadmacro vucisplicemacro
        !           144:                                                  vsplicing-macro vmacro))
        !           145:                            (get ',(cadr l) readtable)))
        !           146:                 (eval-when (compile load eval)
        !           147:                            (setsyntax ',(cadr l) 'vucireadmacro ',(caddr l)))
        !           148:                 
        !           149:                 (and *file*
        !           150:                      (putprop ',(cadr l) *file* 'sourcefile))
        !           151:                 (cond (*oldfunctiondefinition*
        !           152:                        (putprop ',(cadr l) *oldfunctiondefinition* 'oldmacro)
        !           153:                        (list ',(cadr l) 'Redefined))
        !           154:                       ( t ',(cadr l)))))
        !           155:        ( t `(eval-when (compile load eval)
        !           156:                        (setsyntax ',(cadr l) 'vucireadmacro ',(caddr l))))))
        !           157: 
        !           158: ;
        !           159: ; ucilisp selectq function. (written by jkf)
        !           160: ;
        !           161: (defun selectq* macro (form)
        !           162:   ((lambda (x)
        !           163:           `((lambda (,x)
        !           164:                     (cond 
        !           165:                      ,@(maplist 
        !           166:                         (function
        !           167:                          (lambda (ff)
        !           168:                                  (cond ((null (cdr ff))
        !           169:                                         `( t  ,(car ff)))
        !           170:                                        ((atom (caar ff))
        !           171:                                         `((eq ,x ',(caar ff))
        !           172:                                           . ,(cdar ff)))
        !           173:                                        (t
        !           174:                                         `((memq ,x ',(caar ff))
        !           175:                                           . ,(cdar ff))))))
        !           176:                         (cddr form))))
        !           177:             ,(cadr form)))
        !           178:    (gensym 'z)))
        !           179: 
        !           180: (defun some macro (l)
        !           181:   `((lambda (f a)
        !           182:            (prog ()
        !           183:                  loop
        !           184:                  (cond ((null a) (return nil))
        !           185:                        ((funcall f (car a))
        !           186:                         (return a))
        !           187:                        ( t (setq a (cdr a))
        !           188:                            (go loop)))))
        !           189:     ,(cadr l)
        !           190:     ,(caddr l)))
        !           191: 
        !           192: (defmacro subset (fun lis)
        !           193:   `(mapcan (function (lambda (ele)
        !           194:                             (cond ((funcall ,fun ele) (ncons ele)))))
        !           195:           ,lis))
        !           196:   
        !           197: (defun length (l)
        !           198:   (prog (n)
        !           199:        (setq n 0)
        !           200:        loop
        !           201:        (and (atom l) 
        !           202:             (return n))
        !           203:        (setq l (cdr l))
        !           204:        (setq n (1+ n))
        !           205:        (go loop)))
        !           206: 
        !           207: (defmacro apply* (fcn args)
        !           208:   `(prog (fcndef)
        !           209:         (return
        !           210:          (cond ((atom ,fcn)
        !           211:                 (or (and (eq 'binary (type ,fcn))
        !           212:                          (setq fcndef ,fcn))
        !           213:                     (setq fcndef (getd ,fcn)))
        !           214:                 (cond ((or (and (eq 'binary (type fcndef))
        !           215:                                 (eq 'macro (getdisc fcndef)))
        !           216:                            (and (dtpr fcndef)
        !           217:                                 (eq 'macro (car fcndef))))
        !           218:                        (funcall ,fcn (cons ,fcn ,args)))
        !           219:                       ( t (apply ,fcn ,args))))
        !           220:                ( t (apply ,fcn ,args))))))
        !           221: 
        !           222: (defmacro every (fcn args)
        !           223:   `(prog (kkkk)
        !           224:         (setq kkkk ,args)
        !           225:         loop
        !           226:         (cond ((null kkkk)
        !           227:                (return t))
        !           228:               ((apply* ,fcn (list (pop kkkk)))
        !           229:                (go loop)))
        !           230:         (return nil)))
        !           231: 
        !           232: (defun timer fexpr (request)
        !           233:   (let ((timein (ptime)) timeout result cpu garbage)
        !           234:        (prog ()
        !           235:             loop
        !           236:             (setq result (eval (car request)))
        !           237:             (and (setq request (cdr request))
        !           238:                  (go loop)))
        !           239:        (setq timeout (ptime))
        !           240:        (setq cpu (quotient (fix (times 1000
        !           241:                                       (quotient (difference (car timeout)
        !           242:                                                             (car timein))
        !           243:                                                 60.0)))
        !           244:                           1000.0))
        !           245:        (setq garbage (quotient (fix (times 1000
        !           246:                                           (quotient (difference (cadr timeout)
        !           247:                                                                 (cadr timein))
        !           248:                                                     60.0)))
        !           249:                               1000.0))
        !           250:        (print (cons cpu garbage))
        !           251:        (terpri)
        !           252:        result))
        !           253: 
        !           254: (putd 'consp (getd 'dtpr))
        !           255: 
        !           256: (putd 'msgprintfn (getd 'patom))
        !           257:   
        !           258: ;
        !           259: ; ucilisp msg function. (written by jkf)
        !           260: ;
        !           261: (defmacro msg ( &rest body)
        !           262:   `(progn ,@(mapcar 
        !           263:             (function
        !           264:              (lambda (form)
        !           265:                      (cond ((eq form t) '(line-feed 1))
        !           266:                            ((numberp form)
        !           267:                             (cond ((>& form 0) 
        !           268:                                    `(msg-space ,form))
        !           269:                                   ( t `(line-feed ,(minus form)))))
        !           270:                            ((atom form) `(msgprintfn ,form))
        !           271:                            ((eq (car form) t) '(msgprintfn '\  ))
        !           272:                            ((eq (car form) 'e) 
        !           273:                             `(msgprintfn ,(cadr form)))
        !           274:                            ( t `(msgprintfn ,form)))))
        !           275:             body)
        !           276:          nil)) ; return nil!
        !           277:   
        !           278: ;
        !           279: ; this NEED NOT be fixed to not use do.
        !           280: ;
        !           281: (defmacro msg-space (n)
        !           282:   (cond ((eq 1 n) '(patom '" "))
        !           283:        ( t `(do i ,n (1- i) (<& i 1) (patom '\ ))))) 
        !           284: 
        !           285: (defmacro line-feed (n)
        !           286:   (cond ((eq 1 n) '(terpr))
        !           287:        ( t `(do i ,n (1- i) (<& i 1) (terpr)))))
        !           288: 
        !           289: ; compatability functions: functions required by uci lisp but not
        !           290: ;      present in franz
        !           291: ;
        !           292: ; union uses the franz do loop (not the ucilisp one).
        !           293: 
        !           294: (defvar membfn 'member)
        !           295: 
        !           296: (defun union n
        !           297:   (and (> n 0)
        !           298:        (do ((res (ncons nil))
        !           299:            (i 1 (1+ i)))
        !           300:           ((eq i (1+ n)) (car res))
        !           301:           (mapc (function
        !           302:                    (lambda (arg)
        !           303:                       (or (apply* membfn (list arg (car res)))
        !           304:                           (tconc res arg))))
        !           305:                 (arg i)))))
        !           306: 
        !           307: (defun enter (v l)
        !           308:   (cond ((apply* membfn (list v l)) l)
        !           309:        ( t (cons v l))))
        !           310: 
        !           311: (defun append2 (a b &aux (c (ncons nil)))
        !           312:       (do ((a a (cdr a)))
        !           313:          ((null a))
        !           314:          (tconc c (car a)))
        !           315:       (rplacd (cdr c) b)
        !           316:       (car c))
        !           317: 
        !           318: (putd 'noduples (getd 'union))
        !           319: (putd 'append* (getd 'append))
        !           320: (putd '*append (getd 'append))
        !           321: (putd '*dif (getd 'diff))
        !           322: (putd '*eval (getd 'eval))
        !           323: (putd '*great (getd 'greaterp))
        !           324: (putd '*less (getd 'lessp))
        !           325: (putd '*max (getd 'max))
        !           326: (putd '*nconc (getd 'nconc))
        !           327: (putd '*plus (getd 'plus))
        !           328: (putd '*times (getd 'times))
        !           329: (putd 'expandmacro (getd 'macroexpand))
        !           330: (putd 'mapcl (getd 'mapcar))
        !           331: (putd 'memb (getd 'member))
        !           332: 
        !           333: (dm clrbfi () 
        !           334:  '(drain piport))
        !           335: 
        !           336: (defun save fexpr (l)
        !           337:   (let ((fcnname (car l)))
        !           338:        (putprop fcnname (getd fcnname) 'olddef)))
        !           339: 
        !           340: (defun unsave fexpr (l) 
        !           341:   (let* ((name (car l))
        !           342:         (old (get name 'olddef)))
        !           343:        (and old
        !           344:             (putprop name (getd name) 'olddef)
        !           345:             (putd name old))
        !           346:        old))
        !           347: 
        !           348: (putd 'atcat (getd 'concat))
        !           349: 
        !           350: (putd 'gt (getd '>))
        !           351: (putd 'lt (getd '<))
        !           352: 
        !           353: (defun le macro (x)
        !           354:   `(not (> .,(cdr x))))
        !           355: 
        !           356: (defun ge macro (x)
        !           357:   `(not (< .,(cdr x))))
        !           358: 
        !           359: (defun litatom macro (x)
        !           360:   `(and (atom .,(cdr x))
        !           361:        (not (numberp .,(cdr x)))))
        !           362: 
        !           363: (putd 'peekc (getd 'tyipeek))
        !           364: 
        !           365: ;
        !           366: ;      unbound - (setq x (unbound)) will unbind x.
        !           367: ; "this [code] is sick" - jkf.
        !           368: ;
        !           369: (defun unbound macro (l)
        !           370:   `(fake -4))
        !           371: 
        !           372: (or (getd 'franzboundp)
        !           373:   (putd 'franzboundp (getd 'boundp)))
        !           374: 
        !           375: (defun boundp (item)
        !           376:   (cond ((arrayp item))
        !           377:        ((franzboundp item))))
        !           378: 
        !           379: (defvar *dskin* t)
        !           380: (defvar piport)
        !           381: 
        !           382: ;(eval-when (load eval compile)
        !           383: ;  (or (boundp '*dskin*)
        !           384: ;      (setq *dskin* t)))
        !           385: 
        !           386: (eval-when (load eval)
        !           387:   (or (getd 'dskprintfn)
        !           388:       (putd 'dskprintfn (getd 'patom))))
        !           389: 
        !           390: (defun dskin fexpr (l)
        !           391:   (mapc 'dskin1 l)
        !           392:   (terpri) t )
        !           393: 
        !           394: (defun dskin1 (*file*)
        !           395:   (prog (port)
        !           396:        (terpri)
        !           397:        (patom '|>>>|)
        !           398:        (cond ((null (setq port (car (errset (infile *file*) nil))))
        !           399:                     (patom '|couldn't open file |)
        !           400:                     (patom *file*))
        !           401:              ( t (patom *file*)
        !           402:                  (patom '| |)
        !           403:                  (dskin2 port)
        !           404:                  (close port)))))
        !           405: 
        !           406: (defun dskin2 (port)
        !           407:   (prog (expr value)
        !           408:     loop
        !           409:       (cond ((null (setq expr (read port))) nil)
        !           410:            ( t (cond ((memq (car expr) '(de df defmacro dm drm
        !           411:                                             dsm setq def defun))
        !           412:                       (cond ((memq *dskin* '(name both))
        !           413:                              (patom (cadr expr))
        !           414:                              (patom '|: |))))
        !           415:                      ((eq (car expr) 'create)
        !           416:                       (cond ((memq *dskin* '(name both))
        !           417:                              (patom (caddr expr))
        !           418:                              (patom '|: |)))))
        !           419:                (setq value (eval expr))
        !           420:                (and (memq *dskin* '(t both))
        !           421:                     (or (eq value '*invisible*)
        !           422:                         (progn (dskprintfn value)
        !           423:                                (patom '| |))))
        !           424:                (go loop)))))
        !           425: 
        !           426: (defun nequal (arg1 arg2)
        !           427:   (not (equal arg1 arg2)))
        !           428: 
        !           429: (defun readl fexpr (l)
        !           430:   (cond ((null l) (readl1 nil))
        !           431:        ( t (readl1 (eval (car l))))))
        !           432: 
        !           433: (putd 'lineread (getd 'readl))
        !           434: 
        !           435: (defun readl1 (flag)
        !           436:   (cond ((not (and flag
        !           437:                   (eq (tyipeek) 10)
        !           438:                   (tyi)))
        !           439:         (prog (input)
        !           440:               (setq input (ncons nil))  ; initialize for tconc.
        !           441:               loop
        !           442:               (cond ((not (eq (tyipeek) 10))
        !           443:                      (tconc input (read))
        !           444:                      (go loop))
        !           445:                     ( t ; the actual list is in the CAR.
        !           446:                         (tyi)
        !           447:                         (return (car input))))))))
        !           448: 
        !           449: (defun defv fexpr (l)
        !           450:   (set (car l) (cadr l)))
        !           451: 
        !           452: (defun remprops (item proplist)
        !           453:   (mapc (funl (prop)
        !           454:              (remprop item prop))
        !           455:        proplist)
        !           456:   nil)
        !           457: 
        !           458: (defun addprop (id value prop)
        !           459:   (putprop id (enter value (get id prop)) prop))
        !           460: 
        !           461: (defun nconc1 (l elmt)
        !           462:   (rplacd (last l) (cons elmt nil)))
        !           463: 
        !           464: (defun dremove (elmt l)
        !           465:   (let (newl)
        !           466:        (cond ((dtpr l)
        !           467:              (cond ((eq elmt (car l))
        !           468:                     (setq newl (delq elmt l))
        !           469:                     (rplaca l (car newl))
        !           470:                     (rplacd l (cdr newl)))
        !           471:                    ( t (delq elmt l))))
        !           472:             ( t l))))
        !           473: 
        !           474: (defun intersection (set1 set2)
        !           475:   (prog (inter)
        !           476:        (mapc (funl (elt) (putprop elt t '*inter*)) set1)
        !           477:        (mapc (funl (elt) (and (get elt '*inter*)
        !           478:                               (setq inter (cons elt inter))))
        !           479:              set2)
        !           480:        (mapc (funl (elt) (remprop elt '*inter*)) set1)
        !           481:        (return inter)))
        !           482: 
        !           483: (defun initsym1 expr (l)
        !           484:   (prog (num)
        !           485:        (cond ((dtpr l)
        !           486:               (setq num (cadr l))
        !           487:               (setq l (car l)))
        !           488:              ( t (setq num 0)))
        !           489:        (putprop l num 'symctr)
        !           490:        (return (concat l num))))
        !           491: 
        !           492: (defun initsym fexpr (l)
        !           493:   (mapcar (function initsym1) l))
        !           494: 
        !           495: (defun newsym fexpr (l)
        !           496:   (let ((name (car l)))
        !           497:        (concat name
        !           498:               (putprop name
        !           499:                        (1+ (or (get name 'symctr)
        !           500:                                -1))
        !           501:                        'symctr))))
        !           502: 
        !           503: (defun oldsym fexpr (l)
        !           504:   (let ((sym (car l)))
        !           505:        (concat sym (get sym 'symctr))))
        !           506: 
        !           507: (defun allsym fexpr (l)
        !           508:   (prog (num symctr syms)
        !           509:        (cond ((dtpr (car l))
        !           510:               (setq num (cadar l))
        !           511:               (setq l (caar l)))
        !           512:              ( t (setq num 0)
        !           513:                  (setq l (car l))))
        !           514:        (or (setq symctr (get l 'symctr))
        !           515:            (return))
        !           516:        loop
        !           517:        (and (>& num symctr)
        !           518:             (return syms))
        !           519:        (setq syms (cons (concat l symctr) syms))
        !           520:        (setq symctr (1- symctr))
        !           521:        (go loop)))
        !           522: 
        !           523: (defun remsym1 expr (l)
        !           524:   (prog1 (funcall (function oldsym)
        !           525:                  (cond ((dtpr (car l)) (car l))
        !           526:                        ( t  l)))
        !           527:         (mapc (function remob) (apply (function allsym) l))
        !           528:         (cond ((dtpr (car l)) (putprop (caar l) (1- (cadar l)) 'symctr))
        !           529:               ( t (remprop (car l) 'symctr)))))
        !           530: 
        !           531: (defun remsym fexpr (l)
        !           532:   (maplist (function remsym1) l))
        !           533: 
        !           534: (defun symstat fexpr (l)
        !           535:   (mapcar (funl (k)
        !           536:                (list k (get k 'symctr)))
        !           537:          l))
        !           538: 
        !           539: (defun suflist (itemlist num)
        !           540:   (cond ((dtpr itemlist) (nth (1+ num) itemlist))))
        !           541: 
        !           542: ;;;;;;;;;;;;;;;;;;;;;;; (formerly sprint.l) ;;;;;;;;;;;;;;;;;;;;;;;;
        !           543: ;  A few additions to the library file ucbpp.l, mostly to add
        !           544: ;  a UCI Lisp-like "sprint" including some modifications for
        !           545: ;     more flexible printmacros.
        !           546: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !           547: 
        !           548: ; Moved to front and converted to defvar.
        !           549: ; (declare (special poport pparm1 pparm2 lpar rpar form linel))
        !           550: ; (declare (localf *patom1))
        !           551: ; (declare (special *outport* *fileopen* prettyprops))
        !           552: 
        !           553: ; =======================================
        !           554: ; pretty printer top level routine pp
        !           555: ;
        !           556: ;
        !           557: ; calling form- (pp arg1 arg2 ... argn)
        !           558: ; the args may be names of functions, atoms with associated values
        !           559: ; or output descriptors.
        !           560: ; if argi is:
        !           561: ;    an atom - it is assumed to be a function name, if there is no
        !           562: ;             function property associated with it,then it is assumed
        !           563: ;              to be an atom with a value
        !           564: ;    (P port)-  port is the output port where the results of the
        !           565: ;              pretty printing will be sent.
        !           566: ;              poport is the default if no (P port) is given.
        !           567: ;    (F fname)- fname is  a file name to write the results in
        !           568: ;    (A atmname) - means, treat this as an atom with a value, dont
        !           569: ;              check if it is the name of a function.
        !           570: ;    (E exp)-   evaluate exp without printing anything
        !           571: ;    other -   pretty-print the expression as is - no longer an error
        !           572: ;
        !           573: ;    Also, rather than printing only a function defn or only a value, we will
        !           574: ;    let prettyprops decide which props to print.  Finally, prettyprops will
        !           575: ;    follow the CMULisp format where each element is either a property
        !           576: ;    or a dotted pair of the form (prop . fn) where in order to print the
        !           577: ;    given property we call (fn id val prop).  The special properties
        !           578: ;    function and value are used to denote those "properties" which
        !           579: ;    do not actually appear on the plist.
        !           580: ;
        !           581: ; [history of this code: originally came from Harvard Lisp, hacked to
        !           582: ; work under franz at ucb, hacked to work at cmu and finally rehacked
        !           583: ; to work without special cmu macros]
        !           584: ; THEN, hacked to use for PEARL.
        !           585: 
        !           586: ; moved to front.
        !           587: ;(setq prettyprops '((comment . pp-comment)
        !           588: ;                  (function . pp-function)
        !           589: ;                  (value . pp-value)))
        !           590: 
        !           591: ; printret is like print yet it returns the value printed, this is used
        !           592: ; by pp                
        !           593: (def printret
        !           594:   (macro (*l*)
        !           595:         `(progn (print ,@(cdr *l*)) ,(cadr *l*))))
        !           596: 
        !           597: (def pp
        !           598:   (nlambda (*xlist*)
        !           599:        (prog (*outport* *cur* *fileopen* *prl* *atm*)
        !           600: 
        !           601:              (setq *outport* poport)                   ; default port
        !           602:              ; check if more to do, if not close output file if it is
        !           603:              ; open and leave
        !           604: 
        !           605: 
        !           606:    toploop    (cond ((null (setq *cur* (car *xlist*)))
        !           607:                     (condclosefile)
        !           608:                     (terpr)
        !           609:                     (return t)))
        !           610: 
        !           611:              (cond ((dtpr *cur*)
        !           612:                     (cond ((equal 'P (car *cur*))      ; specifying a port
        !           613:                            (condclosefile)             ; close file if open
        !           614:                            (setq *outport* (eval (cadr *cur*))))
        !           615: 
        !           616:                           ((equal 'F (car *cur*))      ; specifying a file
        !           617:                            (condclosefile)             ; close file if open
        !           618:                            (setq *outport* (outfile (cadr *cur*))
        !           619:                                  *fileopen* t))
        !           620: 
        !           621:                                                
        !           622:                           ((equal 'E (car *cur*))
        !           623:                            (eval (cadr *cur*)))
        !           624: 
        !           625:                           ( t (terpri *outport*)
        !           626:                               (*prpr *cur*)))  ;-DNC inserted
        !           627:                     (go botloop)))
        !           628: 
        !           629: 
        !           630:       (mapc (function
        !           631:               (lambda (prop)
        !           632:                       (prog (printer)
        !           633:                             (cond ((dtpr prop)
        !           634:                                    (setq printer (cdr prop))
        !           635:                                    (setq prop (car prop)))
        !           636:                                   ( t (setq printer 'pp-prop)))
        !           637:                             (cond ((eq 'value prop)
        !           638:                                    (cond ((boundp *cur*)
        !           639:                                           (apply printer
        !           640:                                                  (list *cur*
        !           641:                                                        (eval *cur*)
        !           642:                                                        'value)))))
        !           643:                                   ((eq 'function prop)
        !           644:                                    (cond ((and (getd *cur*)
        !           645:                                                (not (bcdp (getd *cur*))))
        !           646:                                           (apply printer
        !           647:                                                  (list *cur*
        !           648:                                                        (getd *cur*)
        !           649:                                                        'function)))))
        !           650:                                   ((get *cur* prop)
        !           651:                                    (apply printer
        !           652:                                           (list *cur*
        !           653:                                                 (get *cur* prop)
        !           654:                                                 prop)))))))
        !           655:            prettyprops)
        !           656: 
        !           657: 
        !           658:  botloop      (setq *xlist* (cdr *xlist*))
        !           659: 
        !           660:              (go toploop))))
        !           661: 
        !           662: ; moved to front.
        !           663: ;(setq pparm1 50 pparm2 100)
        !           664: 
        !           665: ;   -DNC These "prettyprinter parameters" are used to decide when we should
        !           666: ;      quit printing down the right margin and move back to the left -
        !           667: ;      Do it when the leftmargin > pparm1 and there are more than pparm2
        !           668: ;      more chars to print in the expression
        !           669: 
        !           670: ; cmu prefers dv instead of setq
        !           671: 
        !           672: #+cmu
        !           673: (def pp-value (lambda (i v p)
        !           674:                      (terpri *outport*) (*prpr (list 'dv i v))))
        !           675: 
        !           676: #-cmu
        !           677: (def pp-value (lambda (i v p)
        !           678:                      (terpr *outport*) (*prpr `(setq ,i ',v))))
        !           679: (def pp-function (lambda (i v p)
        !           680:                         (terpri *outport*) (*prpr (list 'def i v))))
        !           681: (def pp-prop (lambda (i v p)
        !           682:                     (terpri *outport*) (*prpr (list 'defprop i v p))))
        !           683: 
        !           684: (def condclosefile 
        !           685:   (lambda nil
        !           686:          (cond (*fileopen*
        !           687:                 (terpr *outport*)
        !           688:                 (close *outport*)
        !           689:                 (setq *fileopen* nil)))))
        !           690: 
        !           691: ;
        !           692: ; these routines are meant to be used by pp but since
        !           693: ; some people insist on using them we will set *outport* to nil
        !           694: ; as the default (moved to front).
        !           695: ;(setq *outport* nil)
        !           696: 
        !           697: 
        !           698: (def *prpr 
        !           699:   (lambda (x)
        !           700:          (cond ((not (boundp '*outport*)) (setq *outport* poport)))
        !           701:          (terpr *outport*)
        !           702:          (*prdf x 0 0)))
        !           703: 
        !           704: ; This is the principle addition for PEARL.
        !           705: ; SPRINT simply calls *prdf after filling in any missing parameters.
        !           706: (defun sprint (value &optional (lmar 0) (rmar 0))
        !           707:   (cond ((not (boundp '*outport*)) (setq *outport* poport)))
        !           708:   (*prdf value lmar rmar))
        !           709: 
        !           710: (defvar rmar)  ; -DNC this used to be m - I've tried to
        !           711:                ; to fix up the pretty printer a bit.  It
        !           712:                ; used to mess up regularly on (a b .c) types
        !           713:                ; of lists.  Also printmacros have been added.
        !           714: 
        !           715: 
        !           716: 
        !           717: ; Used to be $prdf but added a bit and changed to * to avoid
        !           718: ;   PEARL's history read macro $.
        !           719: (def *prdf
        !           720:   (lambda (l lmar rmar)
        !           721:     (prog (pmac)
        !           722: ;
        !           723: ;                      - DNC - Here we try to fix the tendency to print a
        !           724: ;                        thin column down the right margin by allowing it
        !           725: ;                        to move back to the left if necessary.
        !           726: ;
        !           727:          (cond ((and (>& lmar pparm1) (>& (flatc l (1+ pparm2)) pparm2))
        !           728:                 (terpri *outport*)
        !           729:                 (princ '"; <<<<< start back on the left <<<<<" *outport*)
        !           730:                 (*prdf l 5 0)
        !           731:                 (terpri *outport*)
        !           732:                 (princ '"; >>>>> continue on the right >>>>>" *outport*)
        !           733:                 (terpri *outport*)
        !           734:                 (return nil)))
        !           735:           (tab lmar *outport*)
        !           736:      a    (cond ((and (dtpr l)
        !           737:                       (atom (car l))
        !           738:                       (setq pmac (get (car l) 'printmacro))
        !           739:                      (cond ((stringp pmac)
        !           740:                             ; Added for PEARL (and UCI Lisp compatibility).
        !           741:                             ; a string printmacro means print this
        !           742:                             ;   string and then the cadr of l if
        !           743:                             ;   it's not nil, and only if l is
        !           744:                             ;   a one- or two-element list.
        !           745:                             (cond ((cddr l) ; more than two elements.
        !           746:                                    nil)
        !           747:                                   ((null (cdr l)) ; only one element.
        !           748:                                    (patom pmac)
        !           749:                                    t)
        !           750:                                   ( t (patom pmac)  ; two elements.
        !           751:                                       (patom (cadr l))
        !           752:                                       t)))
        !           753:                            ( t (apply pmac (list l lmar rmar)))))
        !           754:                 (return nil))
        !           755: ;
        !           756: ;                              -DNC - a printmacro is a lambda (l lmar rmar)
        !           757: ;                              attached to the atom.  If it returns nil then
        !           758: ;                              we assume it did not apply and we continue.
        !           759: ;                              Otherwise we assume it did the job.
        !           760: ;
        !           761:                 ((or (not (dtpr l))
        !           762: ;                    (*** at the moment we just punt hunks etc)
        !           763:                      (and (atom (car l)) (atom (cdr l))))
        !           764:                  (return (printret l *outport*)))
        !           765:                 ((<& (+ rmar (flatc l (chrct *outport*)))
        !           766:                         (chrct *outport*))
        !           767: ;
        !           768: ;      This is just a heuristic - if print can fit it in then figure that
        !           769: ;      the printmacros won't hurt.  Note that despite the pretentions there
        !           770: ;      is no guarantee that everything will fit in before rmar - for example
        !           771: ;      atoms (and now even hunks) are just blindly printed.    - DNC
        !           772: ;
        !           773:                  (printaccross l lmar rmar))
        !           774:                 ((and (*patom1 lpar)
        !           775:                       (atom (car l))
        !           776:                       (not (atom (cdr l)))
        !           777:                       (not (atom (cddr l))))
        !           778:                  (prog (c)
        !           779:                        (printret (car l) *outport*)
        !           780:                        (*patom1 '" ")
        !           781:                        (setq c (nwritn *outport*))
        !           782:                   a    (*prd1 (cdr l) c)
        !           783:                        (cond
        !           784:                         ((not (atom (cdr (setq l (cdr l)))))
        !           785:                          (terpr *outport*)
        !           786:                          (go a)))))
        !           787:                 (t
        !           788:                  (prog (c)
        !           789:                        (setq c (nwritn *outport*))
        !           790:                   a    (*prd1 l c)
        !           791:                        (cond
        !           792:                         ((not (atom (setq l (cdr l))))
        !           793:                          (terpr *outport*)
        !           794:                          (go a))))))
        !           795:      b    (*patom1 rpar))))
        !           796: 
        !           797: (def *prd1
        !           798:   (lambda (l n)
        !           799:     (prog nil
        !           800:           (*prdf (car l)
        !           801:                  n
        !           802:                  (cond ((null (setq l (cdr l))) (|1+| rmar))
        !           803:                        ((atom l) (setq n nil) (+ 4 rmar (pntlen l)))
        !           804:                        ( t rmar)))
        !           805:           (cond
        !           806:            ((null n) (*patom1 '" . ") (return (printret l *outport*))))
        !           807: ;         (*** setting n is pretty disgusting)
        !           808: ;         (*** the last arg to *prdf is the space needed for the suffix)
        !           809: ;              ;Note that this is still not really right - if the prefix
        !           810: ;              takes several lines one would like to use the old rmar 
        !           811: ;(             until the last line where the " . mumble)" goes.
        !           812:        )))
        !           813: 
        !           814: ; -DNC here's the printmacro for progs - it replaces some hackery that
        !           815: ; used to be in the guts of *prdf.
        !           816: 
        !           817: (def printprog
        !           818:   (lambda (l lmar rmar)
        !           819:     (prog (col)
        !           820:           (cond ((cdr (last l)) (return nil)))
        !           821:           (setq col (1+ lmar))
        !           822:           (princ '|(| *outport*)
        !           823:           (princ (car l) *outport*)
        !           824:           (princ '| | *outport*)
        !           825:           (print (cadr l) *outport*)
        !           826:           (mapc '(lambda (x)
        !           827:                         (cond ((atom x)
        !           828:                                (tab col *outport*)
        !           829:                                (print x *outport*))
        !           830:                           ( t (*prdf x (+ lmar 6) rmar))))
        !           831:                (cddr l))
        !           832:           (princ '|)| *outport*)
        !           833:           (return t))))
        !           834: 
        !           835: (putprop 'prog 'printprog 'printmacro)
        !           836: 
        !           837: ; Here's the printmacro for def.  The original *prdf had some special code
        !           838: ; for lambda and nlambda.
        !           839: 
        !           840: (def printdef
        !           841:   (lambda (l lmar rmar)
        !           842:     (cond ((and (\=& 0 lmar)           ; only if we're really printing a defn
        !           843:                 (\=& 0 rmar)
        !           844:                 (cadr l)
        !           845:                 (atom (cadr l))
        !           846:                 (caddr l)
        !           847:                 (null (cdddr l))
        !           848:                 (memq (caaddr l) '(lambda nlambda macro lexpr))
        !           849:                 (null (cdr (last (caddr l)))))
        !           850:            (princ '|(| *outport*)
        !           851:            (princ 'def *outport*)
        !           852:            (princ '| | *outport*)
        !           853:            (princ (cadr l) *outport*)
        !           854:            (terpri *outport*)
        !           855:            (princ '|  (| *outport*)
        !           856:            (princ (caaddr l) *outport*)
        !           857:            (princ '| | *outport*)
        !           858:            (princ (cadaddr l) *outport*)
        !           859:            (terpri *outport*)
        !           860:            (mapc  '(lambda (x) (*prdf x 4 0)) (cddaddr l))
        !           861:            (princ '|))| *outport*)
        !           862:            t))))
        !           863: 
        !           864: (putprop 'def 'printdef 'printmacro)
        !           865: 
        !           866: ; There's a version of this hacked into the printer (where it don't belong!)
        !           867: ; Note that it must NOT apply to things like (quote a b).
        !           868: 
        !           869: (def printquote
        !           870:   (lambda (l lmar rmar)
        !           871:     (cond ((or (null (cdr l)) (cddr l)) nil)
        !           872:           ( t (princ '|'| *outport*) 
        !           873:              (*prdf (cadr l) (1+ lmar) rmar)
        !           874:              t))))
        !           875: 
        !           876: (putprop 'quote 'printquote 'printmacro)
        !           877: 
        !           878: 
        !           879: 
        !           880: 
        !           881: (def printaccross
        !           882:   (lambda (l lmar rmar)
        !           883:     (prog nil
        !           884: ;         (*** this is needed to make sure the printmacros are executed)
        !           885:           (princ '|(| *outport*)  ;)
        !           886:      l:   (cond ((null l))
        !           887:                 ((atom l) (princ '|. | *outport*) (princ l *outport*))
        !           888:                 ( t (*prdf (car l) (nwritn *outport*) rmar)
        !           889:                    (setq l (cdr l))
        !           890:                    (cond (l (princ '| | *outport*)))
        !           891:                    (go l:))))))
        !           892: 
        !           893: 
        !           894: 
        !           895: (def tab (lexpr (n)
        !           896:   (prog (nn prt) (setq nn (arg 1))
        !           897:                (cond ((>& n 1) (setq prt (arg 2))))
        !           898:                (cond ((>& (nwritn prt) nn) (terpri prt)))
        !           899:                (printblanks (- nn (nwritn prt)) prt))))
        !           900: 
        !           901: ; ========================================
        !           902: ;
        !           903: ;      (charcnt port) 
        !           904: ; returns the number of characters left on the current line
        !           905: ; on the given port
        !           906: ;
        !           907: ; =======================================
        !           908: 
        !           909: 
        !           910: (def charcnt
        !           911:      (lambda (port) (- linel (nwritn port))))
        !           912: 
        !           913: (putd 'chrct (getd 'charcnt))
        !           914: 
        !           915: (def *patom1 (lambda (x) (patom x *outport*)))
        !           916: 
        !           917: ; vi: set lisp:

unix.superglobalmegacorp.com

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