From: Brian Candler <redmine@...>
Date: 2009-08-01T17:00:47+09:00
Subject: [ruby-core:24650] [Bug #1853] Cannot make constants using upper-case extended characters?

Bug #1853: Cannot make constants using upper-case extended characters?
http://redmine.ruby-lang.org/issues/show/1853

Author: Brian Candler
Status: Open, Priority: Normal
ruby -v: ruby 1.9.2dev (2009-07-18 trunk 24186) [i686-linux]

>> SCH��N = 1   # constant
=> 1
>> ��BER = 2    # local variable!
=> 2
>> self.class.constants.grep(/SCH|BER/)
=> [:SCH��N]
>> local_variables.grep(/SCH|BER/)
=> [:��BER]

I am not sure from the source code whether this is intentional or not.
In parse.c it uses rb_enc_isupper which understands encodings:

        else if (rb_enc_isupper(m[0], enc)) {
            id = ID_CONST;
        }
        else {
            id = ID_LOCAL;

This is in rb_intern3. And yet it is called from rb_intern2 which says:

ID
rb_intern2(const char *name, long len)
{
    return rb_intern3(name, len, rb_usascii_encoding());
}

If this is intentional, it seems like an arbitrary restriction. Unicode characters are unambiguously classified into upper-case, lower-case and neither. If they can be used anywhere within an identifier, why not at the start of a constant?


----------------------------------------
http://redmine.ruby-lang.org