[Openmcl-devel] "potential numbers" as symbol names
Hamilton Link
helink at sandia.gov
Wed Apr 20 15:12:42 PDT 2005
... with apologies to Mr. Knapp for turning his email upside down ...
On Apr 20, 2005, at 1:43 PM, Dan Knapp wrote:
> Now that I've worked all that out, I guess I don't much care either
> way. :)
> It comes down to whether it's better to tolerate marginal behaviour,
> or to
> "soundly trounce" it.
I think tolerating marginal behavior lets programmers fool themselves
into thinking their code is more portable than it is, and I've been
fooled enough times by tolerant lisps (fooled, up until I tried to
argue something's portability with Foderaro and have been pointed to
obscure passages in cleanup issues or the hyperspec) to feel that early
trouncing is probably the better path.
> So we're left with two interpretations. Either :3 is a token and a
> symbol,
> with cautionary wording in a couple places that it really isn't, or
> it's
> undefined whether :3 is a token at all.
I think the safe bet is to say that :3 isn't a valid token and error,
because it could be justifiably interpreted in several different ways
if it was, and as a case in point different modern implementations were
seemingly interpreting it in different ways at the time of X3J13,
leading up to the cleanup issue.
The rest of this email is just me being pedantic, please skip it. I
can't help it sometimes (just ask my wife, it drives her nuts).
thanks,
h
> At first I thought that this was perfectly well-defined. Remember
> that
> a token is a "textual representation" (glossary), not an actual symbol
> or
> number.
Yeah, I was being sloppy in my prose when I said \3 was a legit symbol
and :3 was not. What I should have said is that \3 is a token that
unambiguously is supposed to resolve into a symbol when read (and :3
isn't unambiguous).
To me (although I don't matter) the package qualifier is sort-of just
there to make sure the reader adjusts its view of the current package
when reading a particular token. It's supposed to be essentially the
same thing as saying
(let ((*package* (find-package package-part)))
(read-from-string the-rest))
If you buy that, it's sensible to think of cl-user:4 as a number,
because the token 4 after an (in-package :cl-user) is a number. So
would be 4 after an (in-package :keyword). So for numbers should any
hinky package qualifier matter, and prevent potential-numberness, or
not?
To some degree it's sophistry to argue one way or the other this late
in the game, since someone closer to the issue has already suggested it
be deemed not well defined.
> Section 2.3.4 seems to say...
> 2.3.5 is somewhat ambiguous...
> If so, this is directly at odds
> with 2.3.4, which does define its interpretation.
This is possibly why the cleanup issue is there.
> However, if :3 is not a
> token at all, there is no conflict, because 2.3.4 describes rules for
> the
> interpretation of tokens.
>
> If :3 were considered a token, it would be a symbol. It is not a
> potential number as defined by 2.3.1.1 (clause 1), because it contains
> a character which is not a digit, number marker, etc (section 2.1.4.2,
> "Character Traits").
>
Well, |:3| is a symbol, but the corresponding token isn't :3, it's \:3
or |:3|. And the token for the symbol whose pname is "3" is \3 or |3|,
so :3 isn't a portable printable representation for anything that you'd
put in the keyword package, while :\3 is. This picky bit might be part
of why the definition of token ended up a little imprecise. Is ':a' a
token, or is the token 'a' and the rest just an indication the token
should be read within the keyword package?
Given what I interpret package qualifiers to mean, :3 isn't a valid
token imho, and conveniently for mho that means you can set the current
package, strip off package qualifiers, and read some unknown thing
without the result flip-flopping between a number and a symbol.
Similarly you can't tack a package qualifier onto just any
readably-printable thing and expect to get back what you started with
when you run READ on it (which, if :3 didn't error, might silently give
you back something of a different type).
> Another minor point: It's incorrect to say that "\3" is a legit
> symbol while
> "3" is not. Both are valid as symbol names in the sense that you can
> call
> INTERN on those strings directly (and they are two different symbols).
> The question is only whether :3 and package:3 are tokens which are to
> be
> interpreted as symbols.
>
Well, since we're talking about the reader it's not fair to use quotes.
\\3 and \3 are two different symbols, yes.
Anyhow, given all this hullaballoo, I think in cl-photo's case it's a
bug in cl-photo to not escape 3 when it's meant to be read as a symbol,
although it's on a technicality.
More information about the Openmcl-devel
mailing list