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.
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
···
On 8/20/07, Victor Zverok Shepelev <vshepelev@imho.com.ua> wrote:
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.
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.
OK. It wasn't "bug report" (as incorporating +:symbol semantics is mostly
evil, in any case), it was just "request for understanging".
V.
···
From: Yukihiro Matsumoto [mailto:matz@ruby-lang.org]
Sent: Wednesday, August 22, 2007 4:59 PM
In message "Re: How +:symbol is parsed" > on Tue, 21 Aug 2007 01:39:00 +0900, "Victor \"Zverok\" Shepelev" ><vshepelev@imho.com.ua> writes:
Yukihiro Matsumoto 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. 
Daniel