[plt-scheme] 299.103
The exp-tagged code in CVS for MzScheme and MrEd is now version 299.103.
This version adds per-struct-type write customization through a
`prop:custom-write' property.
A value for the property must be a pair of procedures. The first
procedure takes an instance of the structure type and returns
information about its sub-parts to be printed recursively. The second
procedure takes an instance of the structure type and returns
information about how it should be printed (a prefix string, a list of
`recur', `display', and `write-special' instructions, and a suffix
string).
Neither procedure actually writes to a port. By returning information
about how things are printed instead of actually printing, the
custom-write procedures support graph detection and pretty printing.
Example (from the manual):
(define (tuple-sub-values tuple)
(tuple-ref tuple 0))
(define (tuple-print tuple write? special-ok?)
(values (if write? "<" "")
(cdr (apply
append
(map (lambda (elem) `((display . ",") (recur . ,elem)))
(tuple-ref tuple 0))))
(if write? ">" "")))
(define-values (s:tuple make-tuple tuple? tuple-ref tuple-set!)
(make-struct-type 'tuple #f 1 0 #f
(list (cons prop:custom-write
(cons tuple-sub-values
tuple-print)))))
(display (make-tuple '(1 2 "a"))) ; prints: 1 , 2 , a
(let ([t (make-tuple (list 1 2 "a"))])
(set-car! (tuple-ref t 0) t)
(write t)) ; prints: #0=<#0# , 2 , "a">
In addition to adding `prop:custom-write', a few details have changed
on the read side:
* Changed `read-syntax[/recursive]' to remove the delta-list argument,
and changed the definition of a read handler to remove the
delta-list argument.
* Added `relocate-input-port' to MzLib's "port.ss". To shift the
source locations associated with a port, wrap it with
`relocate-input-port' (instead of passing deltas to `read-syntax').
* Changed `read[-syntax]/recursive' to produce a special-comment value
when a comment is parsed, instead of reading the next datum. See the
readtable section of the docs for an example.
* Changed `make-input-port' to take two new arguments: a count-lines!
procedure (defaults to `void') and an initial position.
Matthew