[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: nested comments (please correct lexical scope)

> Robby Findler writes:
>> David Van Horn writes:
>> What does the following evaluate to?
>>    (list 'x #;#;'y 'z)
> FWIW, mzscheme and chez scheme do the same thing:
> ...
> > (list 'x #;#;'y 'z)
> (x)
> Taylor Campbell writes:
> MzScheme & Chez, as Robby Findler demonstrated, both give the list (X).
> This is correct.  (SISC & Chicken do, too.)  The reason is that #;
> ignores the single next following S-expression and allows the reader to
> continue on after that.  In the string "#;'y 'z", the #; comments out
> the 'Y part, leaving the 'Z part.  Since a #; precedes that string in
> your example, the 'Z part is ignored, too, so the whole thing is read
> as (LIST (QUOTE X)), which evaluates to the list (X).
> This is an excellent & possibly initially confusing example (though the
> explanation is simple & straightforward), so I'll add it to the SRFI
> document.  I'll also add another example of nested comments, too:
>   (list 'a #;(list 'b #;'c 'd) 'e)    ==>  (LIST (QUOTE A) (QUOTE E))
> The inner #; comments out the following 'C, but the list structure that
> lies a layer above it is still read as a complete S-expression -- in
> particular, (LIST (QUOTE B) (QUOTE D)) --.  Then the outer #; comments
> that out, leaving only (LIST (QUOTE A) (QUOTE E)), which evaluates to
> the list (A E).

Personally I believe this is not a good idea, it's neither syntactically
consistent with scheme, nor visually expected: more simply and consistently
I would expect a #; comment to lexically remove the expression/token it's
been lexically prepended to, nothing else. (including white-space). i.e.:

#; => 

#;#; =>

#;a =>

#;#;a =>

#;#; a => a

#;(a b) => 

#; (a b) => (a b)

(#;a b) => (b)

(#; a b) => (a b)

(#;#; a b) => (a b)

(#; #; a b) => (a b)

(#; #;a b) => (b)

(#;a #;b) => ()

(a #; b #;c) => (a b)

And just to be certain, as earlier comments make reference to strings,
although suspect not intended, #; should defiantly not affect what's inside
of strings, as strings are themselves an literal expression unto themselves:

#; "a b c" => "a b c"

#;"a b c" =>

"#;a b c" => "#;a b c"

Let's at least try to make such a feature as consistent with similar
syntactic abbreviations;

As I don't suspect anyone would expect:

''a b c => (quote a) (quote b) c ; would they?

They'd expect:

''a b c => (quote (quote a)) b c

Where possibly with respect to:

> Aubrey Jaffer wrote:
> -- Function: comment string1 ...
>     Appends STRING1 ... to the strings given as arguments to previous
>     calls `comment'.
> -- Function: comment
>     Returns the (appended) strings given as arguments to previous calls
>     `comment' and empties the current string collection.
> -- Load syntax: #;text-till-end-of-line
>     Behaves as `(comment "TEXT-TILL-END-OF-LINE")'.

(comment ...) seems like a nice feature, but personally suspect it's just
As convenient and feature preserving to utilize #; to lexically remove
expressions it's been prepended to, while preserving the explicit use of
(comment ...) within code. (but it's just an opinion).