112067Sbaden ; FP interpreter/compiler 212067Sbaden ; Copyright (c) 1982 Scott B. Baden 312067Sbaden ; Berkeley, California 4*21728Sdist ; 5*21728Sdist ; Copyright (c) 1982 Regents of the University of California. 6*21728Sdist ; All rights reserved. The Berkeley software License Agreement 7*21728Sdist ; specifies the terms and conditions for redistribution. 8*21728Sdist ; 9*21728Sdist (setq SCCS-fpPP.l "@(#)fpPP.l 5.1 (Berkeley) 05/31/85") 10*21728Sdist 1112067Sbaden ;; pretty printer for fp -- snarfed from FRANZ LISP 1212067Sbaden 1312067Sbaden (include specials.l) 1412067Sbaden 1512067Sbaden (declare (special fpPParm1 fpPParm2 lAngle rAngle)) 1612067Sbaden 1712067Sbaden ; printRet is like print yet it returns the value printed, 1812067Sbaden ; this is used by fpPP. 1912067Sbaden 2012067Sbaden (def printRet 2112067Sbaden (macro ($l$) 2212067Sbaden `(progn 2312067Sbaden (let ((z ,@(cdr $l$))) 2412067Sbaden (cond ((null z) (patom "<>")) 2512067Sbaden (t 2612067Sbaden (print ,@(cdr $l$)))))))) 2712067Sbaden 2812067Sbaden 2912067Sbaden (def fpPP 3012067Sbaden (lambda (x) 3112067Sbaden (terpri) 3212067Sbaden (prDF x 0 0) 3312067Sbaden (terpri))) 3412067Sbaden 3512067Sbaden 3612067Sbaden (setq fpPParm1 50 fpPParm2 100) 3712067Sbaden 3812067Sbaden ; -DNC These "prettyprinter parameters" are used to decide when we should 3912067Sbaden ; quit printing down the right margin and move back to the left - 4012067Sbaden ; Do it when the leftmargin > fpPParm1 and there are more than fpPParm2 4112067Sbaden ; more chars to print in the expression 4212067Sbaden 4312067Sbaden 4412067Sbaden 4512067Sbaden (declare (special rmar)) 4612067Sbaden 4712067Sbaden (def prDF 4812067Sbaden (lambda (l lmar rmar) 4912067Sbaden (prog nil 5012067Sbaden ; 5112067Sbaden ; - DNC - Here we try to fix the tendency to print a 5212067Sbaden ; thin column down the right margin by allowing it 5312067Sbaden ; to move back to the left if necessary. 5412067Sbaden ; 5512067Sbaden (cond ((and (>& lmar fpPParm1) (>& (flatc l (1+ fpPParm2)) fpPParm2)) 5612067Sbaden (terpri) 5712067Sbaden (patom "; <<<<< start back on the left <<<<<") 5812067Sbaden (prDF l 5 0) 5912067Sbaden (terpri) 6012067Sbaden (patom "; >>>>> continue on the right >>>>>") 6112067Sbaden (terpri) 6212067Sbaden (return nil))) 6312067Sbaden (tab lmar) 6412067Sbaden a (cond 6512067Sbaden ((or (not (dtpr l)) 6612067Sbaden ; (*** at the moment we just punt hunks etc) 6712067Sbaden ;(and (atom (car l)) (atom (cdr l))) 6812067Sbaden ) 6912067Sbaden (return (printRet l))) 7012067Sbaden ((<& (+ rmar (flatc l (charcnt poport))) 7112067Sbaden (charcnt poport)) 7212067Sbaden ; 7312067Sbaden ; This is just a heuristic - if print can fit it in then figure that 7412067Sbaden ; the printmacros won't hurt. Note that despite the pretentions there 7512067Sbaden ; is no guarantee that everything will fit in before rmar - for example 7612067Sbaden ; atoms (and now even hunks) are just blindly printed. - DNC 7712067Sbaden ; 7812067Sbaden (printAccross l lmar rmar)) 7912067Sbaden ((and ($patom1 lAngle) 8012067Sbaden (atom (car l)) 8112067Sbaden (not (atom (cdr l))) 8212067Sbaden (not (atom (cddr l)))) 8312067Sbaden (prog (c) 8412067Sbaden (printRet (car l)) 8512067Sbaden ($patom1 '" ") 8612067Sbaden (setq c (nwritn)) 8712067Sbaden a (prD1 (cdr l) c) 8812067Sbaden (cond 8912067Sbaden ((not (atom (cdr (setq l (cdr l))))) 9012067Sbaden (terpri) 9112067Sbaden (go a))))) 9212067Sbaden (t 9312067Sbaden (prog (c) 9412067Sbaden (setq c (nwritn)) 9512067Sbaden a (prD1 l c) 9612067Sbaden (cond 9712067Sbaden ((not (atom (setq l (cdr l)))) 9812067Sbaden (terpri) 9912067Sbaden (go a)))))) 10012067Sbaden b ($patom1 rAngle)))) 10112067Sbaden 10212067Sbaden 10312067Sbaden (def prD1 10412067Sbaden (lambda (l n) 10512067Sbaden (prog nil 10612067Sbaden (prDF (car l) 10712067Sbaden n 10812067Sbaden (cond ((null (setq l (cdr l))) (|1+| rmar)) 10912067Sbaden ((atom l) (setq n nil) (plus 4 rmar (pntlen l))) 11012067Sbaden (t rmar))) 11112067Sbaden 11212067Sbaden ; The last arg to prDF is the space needed for the suffix 11312067Sbaden ; Note that this is still not really right - if the prefix 11412067Sbaden ; takes several lines one would like to use the old rmar 11512067Sbaden ; until the last line where the " . mumble" goes. 11612067Sbaden ))) 11712067Sbaden 11812067Sbaden 11912067Sbaden (def printAccross 12012067Sbaden (lambda (l lmar rmar) 12112067Sbaden (prog nil 12212067Sbaden ; this is needed to make sure the printmacros are executed 12312067Sbaden (princ '|<|) 12412067Sbaden l: (cond ((null l)) 12512067Sbaden (t (prDF (car l) (nwritn) rmar) 12612067Sbaden (setq l (cdr l)) 12712067Sbaden (cond (l (princ '| |))) 12812067Sbaden (go l:)))))) 129