Email list hosting service & mailing list manager


Re: SRFI-108/SRFI-109 special characters Per Bothner 25 Nov 2012 08:31 UTC

On 11/24/2012 07:39 PM, John Cowan wrote:
> In full:  #&name{...} is a quasi-literal in Scheme-mode.  Within a
> quasi-literal, &{...} is an enclosed expression, &name{...} is an
> embedded quasi-literal.
>
>> You could probably do that, but I think it slightly hurts readability
>> for a pretty limited gain.
>
> Eh, if we can live with )))), we can live with }}}};

We certainly can; I'm not yet sure that would be my preference.
Especially since if we keep "initial expressions" (which I think
is best) - in thar case we need to use brackets as well.

>actually, I find
> those more readable than )])] or }]}].

That I can sympathise with ...

>>> But if initial expressions are to be kept, I don't see why the example
>>> #&cname[&{exp1 exp2}text} should be expanded into something involving
>>> an empty string.  Does #&cname[&{exp1}&{exp2}] expand to ($quasi-value$
>>> cname "" exp1 "" exp2 "")?  Surely not.
>>
>> Surely they do - or at least that's what I'm proposing.  It seems excessive,
>> but it allows cname's macro-transformer to determine the structure of the
>> quasi-literal - if it wants to.
>
> Consider the reverse direction.  If (foo "" bar "" baz "") corresponds to
> #&foo[&{bar}&{baz}], then what in the absence of initial expressions does
> (foo bar baz) correspond to?

With initial expressions, it corresponds to #&foo{bar baz}

> It can't be #&foo[&{bar baz}], because the grammar does not allow that.

Actually, the grammar does.  However the translation (in SRFI-107) is wrong.
It should be:
   TrContent[&{expression...}]
      ==> expression ...

>> An example where this matters is in the XQuery language, where you have:
>> <b>{1}{2}</b> ==> <b>12</b>
>> <b>{(1,2)}</b ==> <b>1 2</b>
>> I.e. it may be important to tell the boundaries of enclosed expressions.
>
> In S-expressions, though, the former case doesn't arise, because
> #&b[&{1}&{2}] ==> (b 1 2) on my assumption or (b " " 1 "" 2 "") on yours;
> if you want (b 12) you have to do something at runtime to concatenate
> these expressions.

Right - but such concatenation is likely to be common.  Many simple
constructors will just concatenate the strings and then parse the
resulting string in some matter.

>> and in the limit:
>> #&cname[&{exp1}&{exp2}]
>>      ==> ($quasi-value$ cname "" exp1 "" exp2 "")
>
> Yes, I see that, but it seems like overkill still.  And it does complicate
> writing a syntax-rules macro with ... elimination, where the ... has to
> iterate over the unwanted empty strings as well.

Not really.  If you have to handle multiple non-empty strings,
then handling empty strings isn't a problem.
--
	--Per Bothner
xxxxxx@bothner.com   http://per.bothner.com/