[movitz-cvs] CVS update: movitz/losp/muerte/print.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Tue Apr 13 15:15:55 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv26853
Modified Files:
print.lisp
Log Message:
Extracted internal-write from write. *print-safely* should work again.
Date: Tue Apr 13 11:15:55 2004
Author: ffjeld
Index: movitz/losp/muerte/print.lisp
diff -u movitz/losp/muerte/print.lisp:1.6 movitz/losp/muerte/print.lisp:1.7
--- movitz/losp/muerte/print.lisp:1.6 Tue Apr 13 10:22:02 2004
+++ movitz/losp/muerte/print.lisp Tue Apr 13 11:15:55 2004
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Created at: Mon Sep 3 11:48:19 2001
;;;;
-;;;; $Id: print.lisp,v 1.6 2004/04/13 14:22:02 ffjeld Exp $
+;;;; $Id: print.lisp,v 1.7 2004/04/13 15:15:55 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -161,9 +161,8 @@
((:readably *print-readably*) *print-readably*)
right-margin)
(numargs-case
- (t (object &key safe-recursive-call
+ (t (object &key stream
;; lines miser-width pprint-dispatch right-margin case circle
- ((:stream *standard-output*) *standard-output*)
((:array *print-array*) *print-array*)
((:base *print-base*) *print-base*)
((:escape *print-escape*) *print-escape*)
@@ -173,158 +172,161 @@
((:pretty *print-pretty*) *print-pretty*)
((:radix *print-radix*) *print-radix*)
((:readably *print-readably*) *print-readably*))
- (cond
- ((and *print-safely* (not safe-recursive-call))
- (handler-case (write object :safe-recursive-call t)
- (t (condition)
- (write-string "#<printer error>"))))
- (t (write object))))
+ (let ((*standard-output* (output-stream-designator stream)))
+ (write object)))
(1 (object)
- (let ((stream (output-stream-designator *standard-output*)))
- (cond
- ((and (not *print-pretty*)
- (not *never-use-print-object*))
- (print-object object stream))
- (t (let ((do-escape-p (or *print-escape* *print-readably*))
- (*print-level* (minus-if *print-level* 1)))
- (typecase object
- (character
- (if (not do-escape-p)
- (write-char object stream)
- (progn
- (write-string "#\\" stream)
- (let ((name (char-name object)))
- (if name
- (write-string name stream)
- (write-char object stream))))))
- (null
- (write-string (symbol-name nil) stream))
- ((or cons tag5)
- (let ((level *print-level*)
- (length *print-length*))
- (cond
- ((and level (minusp level))
- (write-char #\# stream))
- ((and (eq 'quote (car object))
- (not (cddr object)))
- (write-char #\' stream)
- (write (cadr object)))
- (t (labels ((write-cons (c stream length)
- (cond
- ((and length (= 0 length))
- (write-string "...)"))
- (t (write (car c))
- (typecase (cdr c)
- (null
- (write-char #\) stream))
- (cons
- (write-char #\space stream)
- (write-cons (cdr c) stream (minus-if length 1)))
- (t
- (write-string " . " stream)
- (write (cdr c))
- (write-char #\) stream)))))))
- (write-char #\( stream)
- (write-cons object stream length))))))
- (integer
- (write-integer object stream *print-base* *print-radix*))
- (string
- (if do-escape-p
- (stream-write-escaped-string stream object #\")
- (write-string object stream)))
- (symbol ; 22.1.3.3 Printing Symbols
- (flet ((write-symbol-name (symbol stream)
- (let ((name (symbol-name symbol)))
- (if (and (plusp (length name))
- (every (lambda (c)
- (or (upper-case-p c)
- (member c '(#\- #\% #\$ #\* #\@ #\. #\& #\< #\> #\=))
- (digit-char-p c)))
- name)
- (not (every (lambda (c)
- (or (digit-char-p c *read-base*)
- (member c '(#\.))))
- name)))
- (write-string name stream)
- (stream-write-escaped-string stream name #\|)))))
- (cond
- ((not do-escape-p)
- (write-symbol-name object stream))
- ((eq (symbol-package object) (find-package "KEYWORD"))
- (write-string ":" stream)
- (write-symbol-name object stream))
- ((or (eq (symbol-package object) *package*)
- (eq (find-symbol (string object))
- object))
- (write-symbol-name object stream))
- ((symbol-package object)
- (let ((package (symbol-package object)))
- (write-string (package-name package) stream)
- (write-string (if (gethash (symbol-name object)
- (package-object-external-symbols package))
- ":" "::")
- stream)
- (write-symbol-name object stream)))
- ((not (symbol-package object))
- (when *print-gensym*
- (write-string "#:" stream))
- (write-symbol-name object stream))
- (t (error "Huh?")))))
- (vector
- (let ((level *print-level*)
- (length *print-length*))
- (cond
- ((and level (minusp level))
- (write-char #\# stream))
- ((or *print-array* *print-readably*)
- (write-string "#(" stream)
- (cond
- ((and length (< length (length object)))
- (dotimes (i length)
- (unless (= 0 i)
- (write-char #\space stream))
- (write (aref object i)))
- (write-string " ...)" stream))
- (t (dotimes (i (length object))
- (unless (= 0 i)
- (write-char #\space stream))
- (write (aref object i)))
- (write-char #\) stream))))
- (t (print-unreadable-object (object stream :identity t)
- (princ (type-of object) stream))))))
- (standard-gf-instance
- (print-unreadable-object (object stream)
- (format stream "gf ~S" (funobj-name object))))
- (compiled-function
- (print-unreadable-object (object stream)
- (format stream "function ~S" (funobj-name object))))
- (hash-table
+ (if (not *print-safely*)
+ (internal-write object)
+ (handler-case (internal-write object)
+ (serious-condition (c)
+ (format t "#<printer error for ~Z: [~A]>" object c)))))))
+
+(defun internal-write (object)
+ (let ((stream *standard-output*))
+ (cond
+ ((and (not *print-pretty*)
+ (not *never-use-print-object*))
+ (print-object object stream))
+ (t (let ((do-escape-p (or *print-escape* *print-readably*))
+ (*print-level* (minus-if *print-level* 1)))
+ (typecase object
+ (character
+ (if (not do-escape-p)
+ (write-char object stream)
+ (progn
+ (write-string "#\\" stream)
+ (let ((name (char-name object)))
+ (if name
+ (write-string name stream)
+ (write-char object stream))))))
+ (null
+ (write-string (symbol-name nil) stream))
+ ((or cons tag5)
+ (let ((level *print-level*)
+ (length *print-length*))
+ (cond
+ ((and level (minusp level))
+ (write-char #\# stream))
+ ((and (eq 'quote (car object))
+ (not (cddr object)))
+ (write-char #\' stream)
+ (write (cadr object)))
+ (t (labels ((write-cons (c stream length)
+ (cond
+ ((and length (= 0 length))
+ (write-string "...)"))
+ (t (write (car c))
+ (typecase (cdr c)
+ (null
+ (write-char #\) stream))
+ (cons
+ (write-char #\space stream)
+ (write-cons (cdr c) stream (minus-if length 1)))
+ (t
+ (write-string " . " stream)
+ (write (cdr c))
+ (write-char #\) stream)))))))
+ (write-char #\( stream)
+ (write-cons object stream length))))))
+ (integer
+ (write-integer object stream *print-base* *print-radix*))
+ (string
+ (if do-escape-p
+ (stream-write-escaped-string stream object #\")
+ (write-string object stream)))
+ (symbol ; 22.1.3.3 Printing Symbols
+ (flet ((write-symbol-name (symbol stream)
+ (let ((name (symbol-name symbol)))
+ (if (and (plusp (length name))
+ (every (lambda (c)
+ (or (upper-case-p c)
+ (member c '(#\- #\% #\$ #\* #\@ #\. #\& #\< #\> #\=))
+ (digit-char-p c)))
+ name)
+ (not (every (lambda (c)
+ (or (digit-char-p c *read-base*)
+ (member c '(#\.))))
+ name)))
+ (write-string name stream)
+ (stream-write-escaped-string stream name #\|)))))
+ (cond
+ ((not do-escape-p)
+ (write-symbol-name object stream))
+ ((eq (symbol-package object) (find-package "KEYWORD"))
+ (write-string ":" stream)
+ (write-symbol-name object stream))
+ ((or (eq (symbol-package object) *package*)
+ (eq (find-symbol (string object))
+ object))
+ (write-symbol-name object stream))
+ ((symbol-package object)
+ (let ((package (symbol-package object)))
+ (write-string (package-name package) stream)
+ (write-string (if (gethash (symbol-name object)
+ (package-object-external-symbols package))
+ ":" "::")
+ stream)
+ (write-symbol-name object stream)))
+ ((not (symbol-package object))
+ (when *print-gensym*
+ (write-string "#:" stream))
+ (write-symbol-name object stream))
+ (t (error "Huh?")))))
+ (vector
+ (let ((level *print-level*)
+ (length *print-length*))
+ (cond
+ ((and level (minusp level))
+ (write-char #\# stream))
+ ((or *print-array* *print-readably*)
+ (write-string "#(" stream)
+ (cond
+ ((and length (< length (length object)))
+ (dotimes (i length)
+ (unless (= 0 i)
+ (write-char #\space stream))
+ (write (aref object i)))
+ (write-string " ...)" stream))
+ (t (dotimes (i (length object))
+ (unless (= 0 i)
+ (write-char #\space stream))
+ (write (aref object i)))
+ (write-char #\) stream))))
+ (t (print-unreadable-object (object stream :identity t)
+ (princ (type-of object) stream))))))
+ (standard-gf-instance
+ (print-unreadable-object (object stream)
+ (format stream "gf ~S" (funobj-name object))))
+ (compiled-function
+ (print-unreadable-object (object stream)
+ (format stream "function ~S" (funobj-name object))))
+ (hash-table
+ (print-unreadable-object (object stream :identity nil :type nil)
+ (format stream "~S hash-table with ~D entries"
+ (let ((test (hash-table-test object)))
+ (if (typep test 'compiled-function)
+ (funobj-name test)
+ test))
+ (hash-table-count object))))
+ (package
+ (if (package-name object)
(print-unreadable-object (object stream :identity nil :type nil)
- (format stream "~S hash-table with ~D entries"
- (let ((test (hash-table-test object)))
- (if (typep test 'compiled-function)
- (funobj-name test)
- test))
- (hash-table-count object))))
- (package
- (if (package-name object)
- (print-unreadable-object (object stream :identity nil :type nil)
- (format stream "Package ~A with ~D+~D symbols"
- (package-name object)
- (hash-table-count (package-object-external-symbols object))
- (hash-table-count (package-object-internal-symbols object))))
- (print-unreadable-object (object stream :identity t :type t))))
- (t (if (not *never-use-print-object*)
- (print-object object stream)
- (print-unreadable-object (object stream :identity t)
- (cond
- ((typep object 'std-instance)
- (write-string "[std-instance]" stream)
- (write (standard-instance-access (std-instance-class object) 0)))
- ((typep object 'standard-gf-instance)
- (write-string "[std-gf-instance]" stream))
- (t (princ (type-of object) stream)))))))))))
- object)))
+ (format stream "Package ~A with ~D+~D symbols"
+ (package-name object)
+ (hash-table-count (package-object-external-symbols object))
+ (hash-table-count (package-object-internal-symbols object))))
+ (print-unreadable-object (object stream :identity t :type t))))
+ (t (if (not *never-use-print-object*)
+ (print-object object stream)
+ (print-unreadable-object (object stream :identity t)
+ (cond
+ ((typep object 'std-instance)
+ (write-string "[std-instance]" stream)
+ (write (standard-instance-access (std-instance-class object) 0)))
+ ((typep object 'standard-gf-instance)
+ (write-string "[std-gf-instance]" stream))
+ (t (princ (type-of object) stream)))))))))))
+ object)
(defun prin1 (object &optional stream)
(let ((*standard-output* (output-stream-designator stream))
More information about the Movitz-cvs
mailing list