On 26-Aug-07, at 11:29 PM, |/|/ Bendick wrote:
The readtables doc is a bit over my head. Do readtables allow me to define how the system will display a type I create? For example, something like:
(set 1 2 'pi)
{1 2 pi}
(dict 'grass 'green 'sky 'blue 'v8 'red)
[grass => green sky => blue v8 => red]
If not, is such a thing possible through some other means, in gambit?
No readtables do not support this currently. I think they should but it is not clear to me how this should be done.
Currently the only hook for the "printer" is the procedure ##wr which can be redefined. ##wr receives two parameters: we (the write environment) and obj (the object to write). The write environment is a structure containing a flag indicating the writing style (display, write, pretty-print), the output port, the readtable, etc. The procedure ##wr-str can be used to send strings to the write environment. Here's an example:
(define-type point x y) (define-type rect p1 p2)
(set! ##wr (let ((old-wr ##wr)) (lambda (we obj) (cond ((point? obj) (##wr-str we "<") (##wr we (point-x obj)) (##wr-str we " ") (##wr we (point-y obj)) (##wr-str we ">")) ((rect? obj) (##wr-str we "{") (##wr we (rect-p1 obj)) (##wr-str we " ") (##wr we (rect-p2 obj)) (##wr-str we "}")) (else (old-wr we obj))))))
;; this prints: {<1 2> <3 4>}
(pretty-print (make-rect (make-point 1 2) (make-point 3 4)))
Marc