How +:symbol is parsed

Hi.

I wanted to be evil and add my own custom semantics to +:some_symbol
constructs. But I’ve found such consctructs doesn’t call Symbol#+@,
while
+(:some_symbol) does call.

I can suppose it’s reason of numbers construction in parser

+3 #doesn’t calls Fixnum#+@, it’s like Finxum.new(+3),
+(3) #does calls Fixnum#+@, it’s like Fixnum.new(3).+@

but it’s still strange for me this rule works for symbols too (but not
for
strings, +“test” calls String#+@). Can somebody please explain this
strangeness?

Thanks.

V.

On 8/20/07, Victor Zverok S. [email protected] wrote:

but it’s still strange for me this rule works for symbols too (but not for
strings, +“test” calls String#+@). Can somebody please explain this
strangeness?

Thanks.

V.

Well, I haven’t looked at parse.y, but I’ll wager that the difference
between 3 and “test” is that, for numeric literals, a preceding + or -
is considered the sign of the literal number. That is, +3 is a number
all by itself, whereas +“test” doesn’t make sense unless the + is a
method call. There’s also no method call when a number is in
exponential notation like -4.3e+11 .

In ruby-ancient times, a symbol was more like an integer, which may or
may not explain the +:symbol semantics.

-A

Hi,

In message “Re: How +:symbol is parsed”
on Tue, 21 Aug 2007 01:39:00 +0900, “Victor "Zverok" Shepelev”
[email protected] writes:

|I wanted to be evil and add my own custom semantics to +:some_symbol
|constructs. But I’ve found such consctructs doesn’t call Symbol#+@, while
|+(:some_symbol) does call.

For historical reason, + before literals works as “identity” (the
function that returns the argument). This behavior will be fixed in
the future, but not for 1.8.x, sorry.

          matz.

From: Yukihiro M. [mailto:[email protected]]
Sent: Wednesday, August 22, 2007 4:59 PM

function that returns the argument). This behavior will be fixed in
the future, but not for 1.8.x, sorry.

OK. It wasn’t “bug report” (as incorporating +:symbol semantics is
mostly
evil, in any case), it was just “request for understanging”.

V.

Yukihiro M. wrote:

|I wanted to be evil and add my own custom semantics to +:some_symbol
|constructs. But I’ve found such consctructs doesn’t call Symbol#+@, while
|+(:some_symbol) does call.

For historical reason, + before literals works as “identity” (the
function that returns the argument). This behavior will be fixed in
the future, but not for 1.8.x, sorry.

If you have time, would you care to enlighten us on what the historial
cirumstances were? I just love history. So full of interesting nooks and
crannies. :slight_smile:

Daniel