home *** CD-ROM | disk | FTP | other *** search
- ;;; Copyright (C) 1984 by Gold Hill Computers
-
- ;; This file contains the GCLisp Pretty Printer.
-
- (DEFVAR *PPRINT-WINDOW-WIDTH* 79)
- (DEFVAR *PPRINT-LEFT-MARGIN* 0)
-
-
- (DEFUN PPRINT (OBJECT &OPTIONAL STREAM)
- (LET ((*PPRINT-QUOTE* NIL)
- (PPRINT-COLUMN 0)
- (*STANDARD-OUTPUT*
- (COND ((NULL STREAM)
- *STANDARD-OUTPUT*)
- ((EQ STREAM T)
- *TERMINAL-IO*)
- (T STREAM)))
- )
- (PPRINT-NEWLINE 0)
- (I-PPRINT OBJECT )
- (VALUES NIL)
- ))
-
-
- (DEFUN I-PPRINT (OBJECT)
- (LET ((CURRENT-MARGIN (GET-COLUMN)))
- (COND ((SYMBOLP OBJECT)
- (PPATOM OBJECT CURRENT-MARGIN))
- ((NUMBERP OBJECT)
- (PPNUMBER OBJECT CURRENT-MARGIN))
- ((ARRAYP OBJECT)
- (PPARRAY OBJECT CURRENT-MARGIN))
- ((LISTP OBJECT)
- (PPLIST OBJECT CURRENT-MARGIN))
- (T
- (PRIN1 OBJECT ))
- )))
-
-
- (DEFUN PPLIST (OBJECT CURRENT-MARGIN)
- (LET ((PPRINT-PROP NIL)
- (FIRST (FIRST OBJECT))
- (REST (REST OBJECT)))
- (COND ((AND (SYMBOLP FIRST)
- (GET FIRST 'PPRINT) )
- (SETQ PPRINT-PROP (GET FIRST 'PPRINT))
- (IF (SYMBOLP PPRINT-PROP)
- (APPLY PPRINT-PROP (LIST OBJECT))
- (I-PPLIST OBJECT PPRINT-PROP CURRENT-MARGIN)))
- ( T
- (PPRINT-WRITE-CHAR #\( )
- (WHEN OBJECT
- (I-PPRINT (CAR OBJECT))
- (I-PPLIST1 REST))
- (PPRINT-WRITE-CHAR #\) ))
- )))
-
- (DEFUN I-PPLIST1 (OBJECT)
- (WHEN (UPDATE-LINE-COUNT (IF (LISTP OBJECT) (FIRST OBJECT) OBJECT))
- (PPRINT-NEWLINE CURRENT-MARGIN))
- (WHEN OBJECT (PPRINT-WRITE-CHAR #\SPACE))
- (COND ((TYPEP OBJECT 'CONS)
- (I-PPRINT (FIRST OBJECT))
- (I-PPLIST1 (REST OBJECT))
- )
- (OBJECT
- (PPRINT-WRITE-CHAR #\.)
- (PPRINT-WRITE-CHAR #\SPACE)
- (I-PPRINT OBJECT))
- ))
-
-
- ;; The real work horse, used to pprint all of the
- ;; special forms which have templates.
-
- (DEFUN I-PPLIST (OBJECT TEMPLATE CURRENT-MARGIN)
- (PPRINT-WRITE-CHAR #\()
- (PPRINT-PRINC (FIRST OBJECT))
- (PPRINT-WRITE-CHAR #\SPACE)
- (DO* ((TEMPLATE TEMPLATE (REST TEMPLATE))
- (REST (REST OBJECT) (REST REST))
- (FORM (FIRST REST) (FIRST REST))
- (STRUCT (CAAR TEMPLATE) (CAAR TEMPLATE))
- (INDENT (CADAR TEMPLATE) (CADAR TEMPLATE))
- (NEW-LINEP (FIRST (CDDAR TEMPLATE))
- (FIRST (CDDAR TEMPLATE))))
- ((NULL TEMPLATE) )
- (UNLESS (NULL (FIRST TEMPLATE))
- (WHEN NEW-LINEP
- (PPRINT-NEWLINE (+ CURRENT-MARGIN INDENT)))
-
- (CASE STRUCT
- (NAME
- (I-PPRINT FORM)
- (PPRINT-WRITE-CHAR #\SPACE))
- (LAMBDA-LIST
- (PPLIST FORM (+ CURRENT-MARGIN 8)))
- (COND-BODY
- (DOLIST (EXPRESION REST)
- (PPRINT-WRITE-CHAR #\()
- (I-PPRINT (FIRST EXPRESION))
- (PPRINT-NEWLINE (+ CURRENT-MARGIN (+ INDENT 1)))
- (FORM2-PPRINT (CDR EXPRESION)
- (+ INDENT 1)
- CURRENT-MARGIN)
- (PPRINT-WRITE-CHAR #\))
- (PPRINT-NEWLINE (+ CURRENT-MARGIN INDENT))
- ))
- (ARG-PAIRS
- (DO ((ARG1 (FIRST REST) (FIRST REST))
- (ARG2 (CADR REST) (CADR REST))
- (REST (CDDR REST) (CDDR REST))
- (TERMINATOR REST (CDDR TERMINATOR)))
- ((NULL TERMINATOR))
- (I-PPRINT ARG1)
- (PPRINT-WRITE-CHAR #\SPACE)
- (I-PPRINT ARG2)
- (WHEN REST (PPRINT-NEWLINE (+ CURRENT-MARGIN INDENT)))
- ))
- (CONDITION
- (I-PPRINT FORM))
- (COND-PAIR
- (FORM1-PPRINT FORM INDENT CURRENT-MARGIN))
- (PROG-BODY-REST
- (FORM2-PPRINT REST INDENT CURRENT-MARGIN))
- (PROG-BODY
- (PPRINT-NEWLINE (+ CURRENT-MARGIN (1- INDENT)))
- (FORM1-PPRINT FORM INDENT CURRENT-MARGIN))
- (DO-BINDINGS
- (FORM1-PPRINT FORM INDENT CURRENT-MARGIN))
- (OTHERWISE (PRINT FORM))
- )))
- (PPRINT-WRITE-CHAR #\))
- )
-
- (DEFUN FORM1-PPRINT (FORM LEVEL CURRENT-MARGIN)
- (PPRINT-WRITE-CHAR #\()
- (FORM2-PPRINT FORM LEVEL CURRENT-MARGIN)
- (PPRINT-WRITE-CHAR #\))
- )
-
- (DEFUN FORM2-PPRINT (FORM LEVEL CURRENT-MARGIN)
- (LET ((FIRST NIL)
- (VERTICAL (AND (> 2 (LENGTH FORM))(UPDATE-LINE-COUNT FORM))))
- (DOLIST (THING FORM)
- (WHEN (OR VERTICAL FIRST)
- (WHEN FIRST (PPRINT-NEWLINE (+ CURRENT-MARGIN LEVEL))))
- (SETQ FIRST T)
- (I-PPRINT THING ))
- ))
-
- (DEFUN PPNUMBER (OBJECT CURRENT-MARGIN)
- (WHEN (UPDATE-LINE-COUNT OBJECT)
- (PPRINT-NEWLINE (+ CURRENT-MARGIN 2)))
- (SETF PPRINT-COLUMN (+ PPRINT-COLUMN (FLATSIZE OBJECT)))
- (PRIN1 OBJECT )
- )
-
- ;; For PPRINTing atoms
- ;;
- (DEFUN PPATOM (OBJECT CURRENT-MARGIN)
- (WHEN (UPDATE-LINE-COUNT OBJECT)
- (PPRINT-NEWLINE (+ CURRENT-MARGIN 2)))
- (SETF PPRINT-COLUMN (+ PPRINT-COLUMN (FLATSIZE OBJECT)))
- (PRIN1 OBJECT)
- )
-
- ;; For PPRINTing arrays
- ;;
- (DEFUN PPARRAY (OBJECT CURRENT-MARGIN)
- (WHEN (UPDATE-LINE-COUNT OBJECT)
- (PPRINT-NEWLINE))
- (SETF PPRINT-COLUMN (+ PPRINT-COLUMN (FLATSIZE OBJECT)))
- (PRIN1 OBJECT)
- )
-
- (DEFUN PPRINT-NEWLINE (&OPTIONAL (PPRINT-LEFT-MARGIN (GET-COLUMN)))
- (PPRINT-WRITE-CHAR #\NEWLINE)
- (DOTIMES (I PPRINT-LEFT-MARGIN) (PPRINT-WRITE-CHAR #\SPACE))
- )
-
- (DEFUN PPRINT-PRINC (OBJECT)
- (PRINC OBJECT)
- (SETF PPRINT-COLUMN (+ PPRINT-COLUMN (FLATSIZE OBJECT))))
-
- (DEFUN PPRINT-WRITE-CHAR (CHAR)
- (IF (EQ CHAR #\NEWLINE)
- (SETF PPRINT-COLUMN 0)
- (INCF PPRINT-COLUMN))
- (WRITE-CHAR CHAR)
- )
-
-
-
- ;; A test to see if something is going to fit on a line
- ;;
- (DEFUN UPDATE-LINE-COUNT (OBJECT)
- (IF OBJECT (>= (+ (GET-COLUMN) (FLATSIZE OBJECT))
- *PPRINT-WINDOW-WIDTH*)
- NIL))
-
-
- ;; simply return the pretty printer curent column
- ;;
- (DEFUN GET-COLUMN ()
- PPRINT-COLUMN)
-
- ;; The following are the standard GCLisp templates used for
- ;; pretty printing all special forms and macros.
- ;;
-
-
- (PUTPROP 'AND '((PROG-BODY-REST 5)) 'PPRINT)
-
- (PUTPROP 'BLOCK '((NAME 0) (PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'CASE '((CONDITION 5)(COND-BODY 6 T)) 'PPRINT)
-
- (PUTPROP 'CATCH '((NAME 0) (PROG-BODY-REST 2)) 'PPRINT)
-
- (PUTPROP 'COND '((COND-BODY 6)) 'PPRINT)
-
- (PUTPROP 'DEFUN '((NAME 0)(LAMBDA-LIST 10)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'DEFMACRO '((NAME 0) (NAME 0) (PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'DO '((DO-BINDINGS 5)(PROG-BODY 5)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'DO* '((DO-BINDINGS 6)(PROG-BODY 6)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'DOLIST '((CONDITION 6)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'DOTIMES '((CONDITION 6)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'IF '((CONDITION 4)(PROG-BODY-REST 4 T)) 'PPRINT)
-
- (PUTPROP 'IFN '((CONDITION 5)(PROG-BODY-REST 5 T)) 'PPRINT)
-
- (PUTPROP 'LAMBDA '((LAMBDA-LIST 6)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'LET '((COND-PAIR 6)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'LET* '((COND-PAIR 7)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'LOOP '((PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'MACRO '((NAME 0)(LAMBDA-LIST 10)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'MAPCAR '((NAME 0)(PROG-BODY-REST 8)) 'PPRINT)
-
- (PUTPROP 'MAPC '((NAME 0)(PROG-BODY-REST 6)) 'PPRINT)
-
- (PUTPROP 'MAPCAN '((NAME 0)(PROG-BODY-REST 8)) 'PPRINT)
-
- (PUTPROP 'MAPCON '((NAME 0)(PROG-BODY-REST 8)) 'PPRINT)
-
- (PUTPROP 'MAPL '((NAME 0)(PROG-BODY-REST 6)) 'PPRINT)
-
- (PUTPROP 'MAPLIST '((NAME 0)(PROG-BODY-REST 9)) 'PPRINT)
-
- (PUTPROP 'MULTIPLE-VALUE-SETQ '((PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'MULTIPLE-VALUE-BIND '((PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'MULTIPLE-VALUE-LIST '((PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'PROG '((COND-PAIR 7)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'PROG* '((COND-PAIR 8)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'PROGV '((COND-PAIR 8)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'PROG1 '((PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'PROG2 '((PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'PROGN '((PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'PSETF '((ARG-PAIRS 7)) 'PPRINT)
-
- (PUTPROP 'PSETQ '((ARG-PAIRS 7)) 'PPRINT)
-
- (PUTPROP 'OR '((PROG-BODY-REST 4)) 'PPRINT)
-
- (PUTPROP 'QUOTE 'PPRINT-QUOTE 'PPRINT)
-
- (DEFUN PPRINT-QUOTE (OBJECT)
- (LET ((CURRENT-MARGIN (GET-COLUMN)))
- (COND
- (*PPRINT-QUOTE*
- (I-PPRINT OBJECT))
- (T
- (WHEN (>= (GET-COLUMN) (- *PPRINT-WINDOW-WIDTH* 5))
- (PPRINT-NEWLINE (+ CURRENT-MARGIN 2)))
- (PPRINT-WRITE-CHAR #\')
- (I-PPRINT (CADR OBJECT)))
- )))
-
- (PUTPROP 'SETF '((ARG-PAIRS 6)) 'PPRINT)
-
- (PUTPROP 'SETQ '((ARG-PAIRS 6)) 'PPRINT)
-
- (PUTPROP 'UNLESS '((CONDITION 7)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'UNWIND-PROTECT '((PROG-BODY 2)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- (PUTPROP 'WHEN '((CONDITION 7)(PROG-BODY-REST 2 T)) 'PPRINT)
-
- ;; end of supported code.