This site is a static rendering of the Trac instance that was used by R7RS-WG1 for its work on R7RS-small (PDF), which was ratified in 2013. For more information, see Home.
Source for ticket #440
cc
changetime
2012-10-12 05:04:56
component
WG1 - Core
description
Formal Comment
Submitter's name: Marc Feeley
Submitter's email: feeley at iro.umontreal.ca
Relevant draft: r7rs draft 6
Type: defect
Priority: major
Relevant section of draft: 6.13.3. Output
Summary: Write procedure is not backwards compatible
R7RS introduces a new output procedure called write-simple, which has
the same semantics as the R5RS write procedure. On the other hand,
the R7RS write procedure handles shared structures differently than
the R5RS. For example :
(let ((x (list 1 2))) (write (list x x)))
displays ((1 2) (1 2)) in an R5RS system
and displays (#0=(1 2) #0#) in an R7RS system
To preserve backwards compatibility, it is the version of the write
procedure which uses datum labels which should have a different name.
In fact SRFI-38 has specified the name write-with-shared-structure for
this output procedure. This name should be maintained since it has
been implemented with that name in some Scheme systems.
id
440
keywords
milestone
owner
cowan
priority
major
reporter
alexshinn
resolution
fixed
severity
status
closed
summary
Formal Comment: Write procedure is not backwards compatible
time
2012-07-02 04:12:03
type
defect
Changes
Change at time 2012-10-12 05:04:56
author
cowan
field
comment
newvalue
WG1 voted to adopt `write` (labels for cycles only), `write-simple` (no labels), and `write-shared` (full labels).
oldvalue
3
raw-time
1349993096915224
ticket
440
time
2012-10-12 05:04:56
Change at time 2012-10-12 05:04:56
author
cowan
field
resolution
newvalue
fixed
oldvalue
raw-time
1349993096915224
ticket
440
time
2012-10-12 05:04:56
Change at time 2012-10-12 05:04:56
author
cowan
field
status
newvalue
closed
oldvalue
accepted
raw-time
1349993096915224
ticket
440
time
2012-10-12 05:04:56
Change at time 2012-07-03 02:17:55
author
arcfide
field
comment
newvalue
After further discussion with Marc and evaluating Scheme implementations, I think that we have a valid problem here. On the one hand, we have the desire to be able to preserve datum equivalence across a read and a write, on the other the desire to make certain writes produce valid code. Finally, we have the third desire not to make `write` unstable.
I propose that we can actually do this all with a single procedure `write` and a parameter `print-graph`. When `print-graph` is `#f` then `write` has the traditional semantics, where the behavior on cycles is undefined -- particularly, Schemes may print cycles, or they may infinite loop, but in the non-cycle case, they print the simple structure, and do not preserve shared structure. When `print-graph` is `#t` then `write` must print out the datum preserving shared structure.
The above allows `write` to be backwards compatible, but still enables implementations to implement it safely if they wish to, to handle cycles, but still gives us a way to print shared structure.
I think it is important to provide a safe, default, backwards compatible version of `write`. In that vein, I would want to require implementations that support shared structure to enable `print-graph` implicitly when a cycle is detected.
Another option is to have `write/shared` on the one hand, but then make `write` use `write/shared` whenever a cycle is detected if the implementation provides it. However, this creates some problems for folks who might want a `write` that would infinite loop. The question is whether this is worth it at all?
Using the parameter is more flexible, as it allows us to add an additional switch, where we could say that if `print-graph` is `'cycle` then it will detect cycles, but if it is `#f` it will not, and could infinite loop.
I think the question comes down to whether we want to require the handling of cycles or not.
oldvalue
2
raw-time
1341256675913619
ticket
440
time
2012-07-03 02:17:55
Change at time 2012-07-02 09:44:59
author
cowan
field
comment
newvalue
oldvalue
1
raw-time
1341197099196090
ticket
440
time
2012-07-02 09:44:59
Change at time 2012-07-02 09:44:59
author
cowan
field
owner
newvalue
cowan
oldvalue
alexshinn
raw-time
1341197099196090
ticket
440
time
2012-07-02 09:44:59
Change at time 2012-07-02 09:44:59
author
cowan
field
status
newvalue
accepted
oldvalue
new
raw-time
1341197099196090
ticket
440
time
2012-07-02 09:44:59