[r6rs-discuss] [Formal] identifier-syntax is not a derived form
Andre van Tonder
andre at het.brown.edu
Tue Nov 14 09:56:59 EST 2006
This message is a formal comment which was submitted to formal-comment at r6rs.org, following the requirements described at: http://www.r6rs.org/process.html
Name : Andre van Tonder
Email : andre at het.brown.edu
Type : defect
Priority : minor
Component : libraries
Version : 5.91
Pages : 114
Dependencies: Libraries (phase semantics) and free-identifier=? (p. 112)
Identifier-syntax is not a derived form.
Identifier-syntax cannot currently be portably expressed as a derived form.
I know of two conforming implementations in which it can be so expressed only
with en extension to negative import levels. A third implementation
can express identifier-syntax without negative import levels, but only
by violating the stated semantics of free-identifier=?.
Here is essentially how it must be espressed in two of these implementations:
(library (core identifier-syntax)
(import (for (r6rs syntax-case base) run expand)
(for (r6rs base) expand
(meta -1))) ;; FOR LAST OCCURRENCE OF SET!
(syntax-case x (set!)
(syntax (lambda (x)
(syntax-case x ()
(id (identifier? (syntax id)) (syntax e))
((_ x (... ...)) (syntax (e x (... ...))))))))
((_ (id exp1)
((set! var val) exp2))
(and (identifier? (syntax id))
(identifier? (syntax var)))
(syntax-case x (set!) ;; THIS IS THE PROBLEMATIC OCCURRENCE
((set! var val) (syntax exp2))
((id x (... ...)) (syntax (exp1 x (... ...))))
(id (identifier? (syntax id)) (syntax exp1))))))))))
A third implementation does not require the "(meta -1)". It does so by
modifying the semantics of free-identifier=?. In this implementation, the
"The free-identifier=? procedure returns #t if and only if the two identifiers
would resolve to the same binding if both were to appear in the output of a
transformer outside of any bindings inserted by the transformer."
no longer holds.
Consider refining the semantics of phases, import levels and/or
free-identifier=? to make identifier-syntax expressible as a derived form.
Alternatively, put free-identifier=? somewhere else than the "derived forms"
More information about the r6rs-discuss