> The specification says that datum->syntax takes an arbitrary value as second
> argument. Is it meaningful for this argument to be already a syntax object
> and, if so, what happens to its wrap?
Actually, the description says that the second argument is "an arbitrary
value 'datum'", which is nonsense. It should say, simply, that the second
argument is a datum. A datum is something that can be derived from the
datum syntax. Since syntax objects cannot be derived from the datum
syntax, the problem doesn't arise in correct code.
In Chez Scheme, and in the SRFI 93 reference implementation, if you pass
in a syntax object, the syntax object is treated as a constant; it's wrap
is not comingled in any way with the wraps layered over it. At the base
of each complete wrap, there's a "top mark" that identifies the base, and
the system treats anything below a top-marked wrap as constant data. This
allows it to avoid traversing constants, including cyclic constants and
constants containing syntax objects. I doubt this will be prescribed
behavior, however.
Kent