なかだです。

以前シンボルリテラル記法の拡張の話があったような気がしますが、
どこにいったのか分からないのであらためて提案してみます。

  :'abc-def' == 'abc-def'.intern
  :"abc\xa1\xa1" == "abc\xa1\xa1".intern
  %s{abc-def} == 'abc-def'.intern

の三つです。


Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.223 diff -u -2 -p -r1.223 parse.y --- parse.y 18 Oct 2002 14:13:41 -0000 1.223 +++ parse.y 18 Oct 2002 14:14:17 -0000 @@ -1956,4 +1956,13 @@ sym : fname | tGVAR | tCVAR + | tSTRING_CONTENT tSTRING_END + { + $$ = rb_intern(RSTRING($1->nd_lit)->ptr); + rb_gc_force_recycle((VALUE)$1); + } + | tSTRING_END + { + yyerror("empty symbol literal"); + } ; @@ -2771,4 +2780,5 @@ regx_options() #define STR_FUNC_REGEXP 0x04 #define STR_FUNC_QWORDS 0x08 +#define STR_FUNC_SYMBOL 0x10 #define STR_FUNC_INDENT 0x20 @@ -2780,4 +2790,6 @@ enum string_type { str_sword = (STR_FUNC_QWORDS), str_dword = (STR_FUNC_QWORDS|STR_FUNC_EXPAND), + str_ssym = (STR_FUNC_SYMBOL), + str_dsym = (STR_FUNC_SYMBOL|STR_FUNC_EXPAND), }; @@ -2852,4 +2864,9 @@ tokadd_string(func, term, paren) break; } + if (!c && (func & STR_FUNC_SYMBOL)) { + func &= ~STR_FUNC_SYMBOL; + rb_compile_error("symbol cannot contain '\\0'"); + continue; + } tokadd(c); } @@ -3763,9 +3780,20 @@ yylex() return tCOLON2; } - pushback(c); if (lex_state == EXPR_END || lex_state == EXPR_ENDARG || ISSPACE(c)) { + pushback(c); lex_state = EXPR_BEG; return ':'; } + switch (c) { + case '\'': + lex_strterm = NEW_STRTERM(str_ssym, c, 0); + break; + case '"': + lex_strterm = NEW_STRTERM(str_dsym, c, 0); + break; + default: + pushback(c); + break; + } lex_state = EXPR_FNAME; return tSYMBEG; @@ -3968,4 +3996,9 @@ yylex() lex_strterm = NEW_STRTERM(str_regexp, term, paren); return tREGEXP_BEG; + + case 's': + lex_strterm = NEW_STRTERM(str_ssym, term, paren); + lex_state = EXPR_FNAME; + return tSYMBEG; default:
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦