[#42684] [Ruby 1.9-Bug#4120][Assigned] 2 failures on test/mkmf/test_convertible.rb — Usaku NAKAMURA <redmine@...>
Bug #4120: 2 failures on test/mkmf/test_convertible.rb
なかだです。
こんにちは、なかむら(う)です。
[#42692] [Feature: trunk] String#encode(:fallback) should accept default handler — SASADA Koichi <ko1@...>
ささだです.
[#42701] 1.9.x release and trunk branch policy — Yusuke ENDOH <mame@...>
まつもとさん、Yugui さん
[#42730] [Ruby 1.9-Bug#4143][Open] warning: "SUPPORT_JOKE" is not defined — Kazuhiro NISHIYAMA <redmine@...>
Bug #4143: warning: "SUPPORT_JOKE" is not defined
チケット #4143 が更新されました。 (by Kazuhiro NISHIYAMA)
2010年12月10日22:38 Kazuhiro NISHIYAMA <[email protected]>:
(2010/12/10 23:49), KOSAKI Motohiro wrote:
[#42735] [Ruby 1.9-Feature#4147][Open] Array#sample で重みを指定したい — Yoji Ojima <redmine@...>
Feature #4147: Array#sample で重みを指定したい
チケット #4147 が更新されました。 (by Shyouhei Urabe)
> じゃあ反対ないので実装はともかく、この仕様は基本入れる方向で考えましょう。反対の人は意思表示お早めに。
Yuguiです。
2010年12月19日21:15 Yugui <[email protected]>:
チケット #4147 が更新されました。 (by Yoji Ojima)
遠藤です。
チケット #4147 が更新されました。 (by Yoji Ojima)
[#42758] [Ruby 1.9-Bug#4157][Open] test_pty で、たまに出る Failure — Makoto Kishimoto <redmine@...>
Bug #4157: test_pty で、たまに出る Failure
[#42763] [Ruby 1.9-Bug#4159][Open] test_block_variables(TestRipper::ParserEvents) が失敗する — Kouhei Yanagita <redmine@...>
Bug #4159: test_block_variables(TestRipper::ParserEvents) が失敗する
[#42778] BasicObject#object_id — keiju@... (Keiju ISHITSUKA)
けいじゅ@いしつかです.
[#42782] [Ruby 1.9-Feature#4165][Open] win32ビルドでbaserubyを設定しなかったときのエラーが非常に不親切 — Motohiro KOSAKI <redmine@...>
Feature #4165: win32=E3=83=93=E3=83=AB=E3=83=89=E3=81=A7baseruby=E3=82=92=
[#42832] [Ruby 1.9-Bug#4178][Open] test/rubygems/gemutilities.rb で、よくわからない ArgumentError — Makoto Kishimoto <redmine@...>
Bug #4178: test/rubygems/gemutilities.rb で、よくわからない ArgumentError
[#42869] [feature:trunk] option for Socket#sendmsg — Nobuyoshi Nakada <nobu@...>
なかだです。
2010年12月23日21:01 Nobuyoshi Nakada <[email protected]>:
[#42887] [Ruby 1.9-Feature#4204][Open] IO#advise should raise error for unknown symbol — Tomoyuki Chikanaga <redmine@...>
Feature #4204: IO#advise should raise error for unknown symbol
[#42893] [Ruby 1.8-Bug#4206][Open] failed to set ext option for win32/configure.bat — Akio Tajima <redmine@...>
Bug #4206: failed to set ext option for win32/configure.bat
[#42894] [Ruby 1.8-Feature#4207][Open] これから「1.8.8」の話をしよう -- 1.8がこの先生きのこるには — Shyouhei Urabe <redmine@...>
Feature #4207: これから「1.8.8」の話をしよう -- 1.8がこの先生きのこるには
むらたです。
むらたです。
2011/1/5 Kenta Murata <[email protected]>:
こんにちは、なかむら(う)です。
チケット #4207 が更新されました。 (by Shyouhei Urabe)
チケット #4207 が更新されました。 (by Akinori MUSHA)
[ruby-dev:42733] [Ruby 1.9-Feature#4146][Open] Improvement of Symbol and Proc
Feature #4146: Improvement of Symbol and Proc http://redmine.ruby-lang.org/issues/show/4146 =E8=B5=B7=E7=A5=A8=E8=80=85: Nobuyoshi Nakada =E3=82=B9=E3=83=86=E3=83=BC=E3=82=BF=E3=82=B9: Open, =E5=84=AA=E5=85=88=E5= =BA=A6: Normal =E3=82=AB=E3=83=86=E3=82=B4=E3=83=AA: core =E7=8F=BE=E5=9C=A8Symbol#to_proc=E3=81=A7 %w[12 45 32].map(&:to_i) =E3=81= =AE=E3=82=88=E3=81=86=E3=81=AA=E3=81=93=E3=81=A8=E3=81=AF=E3=81=A7=E3=81=8D= =E3=81=BE=E3=81=99=E3=81=8C=E3=80=81 =E5=BC=95=E6=95=B0=E3=82=92=E4=BB=98=E3=81=91=E3=81=A6=E3=83=A1=E3=82=BD=E3= =83=83=E3=83=89=E3=82=92=E5=91=BC=E3=81=B6=E3=81=93=E3=81=A8=E3=81=AF=E3=81= =A7=E3=81=8D=E3=81=BE=E3=81=9B=E3=82=93=E3=80=82Symbol=E3=83=AA=E3=83=86=E3= =83=A9=E3=83=AB=E3=81=AB=E5=BC=95=E6=95=B0=E3=82=92=E4=BB=98=E3=81=91 =E3=81=9F=E3=82=89=E3=81=9D=E3=81=AE=E5=BC=95=E6=95=B0=E3=81=A8=E5=85=B1=E3= =81=AB=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=82=92=E5=91=BC=E3=81=B6Proc= =E3=82=92=E4=BD=9C=E3=82=8B=E6=A7=8B=E6=96=87=E3=81=A8=E3=81=84=E3=81=86=E3= =81=AE=E3=81=AF=E3=81=A9=E3=81=86=E3=81=A7=E3=81=97=E3=82=87=E3=81=86=E3=81= =8B=E3=80=82 %w[12 45 32].map(&:to_i(9)).map(&:*(2)) #=3D> [22, 82, 58] %w[abc def ghi].map(&:[1]) #=3D> ["b", "e", "h"] ---------------------------------------- http://redmine.ruby-lang.org
Attachments (1)
diff --git i/parse.y w/parse.y
index f2a556a..a7a358a 100644
--- i/parse.y
+++ w/parse.y
@@ -356,6 +356,8 @@ static NODE *arg_append_gen(struct parser_params*,NODE*,NODE*);
#define arg_append(h,t) arg_append_gen(parser,h,t)
static NODE *arg_concat_gen(struct parser_params*,NODE*,NODE*);
#define arg_concat(h,t) arg_concat_gen(parser,h,t)
+static NODE *arg_prepend_gen(struct parser_params*,NODE*,NODE*);
+#define arg_prepend(h,t) arg_prepend_gen(parser,h,t)
static NODE *literal_concat_gen(struct parser_params*,NODE*,NODE*);
#define literal_concat(h,t) literal_concat_gen(parser,h,t)
static int literal_concat0(struct parser_params *, VALUE, VALUE);
@@ -401,6 +403,9 @@ static NODE *match_op_gen(struct parser_params*,NODE*,NODE*);
static ID *local_tbl_gen(struct parser_params*);
#define local_tbl() local_tbl_gen(parser)
+static NODE *symbol_lambda_gen(struct parser_params *, ID, NODE *);
+#define symbol_lambda(mid, args) symbol_lambda_gen(parser, mid, args)
+
static void fixup_nodes(NODE **);
extern int rb_dvar_defined(ID);
@@ -676,7 +681,7 @@ static void token_info_pop(struct parser_params*, const char *token);
keyword__FILE__
keyword__ENCODING__
-%token <id> tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL
+%token <id> tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL tAREFBEG
%token <node> tINTEGER tFLOAT tSTRING_CONTENT tCHAR
%token <node> tNTH_REF tBACK_REF
%token <num> tREGEXP_END
@@ -698,7 +703,7 @@ static void token_info_pop(struct parser_params*, const char *token);
%type <node> assoc_list assocs assoc undef_list backref string_dvar for_var
%type <node> block_param opt_block_param block_param_def f_opt
%type <node> bv_decls opt_bv_decl bvar
-%type <node> lambda f_larglist lambda_body
+%type <node> lambda f_larglist lambda_body sym_lambda
%type <node> brace_block cmd_brace_block do_block lhs none fitem
%type <node> mlhs mlhs_head mlhs_basic mlhs_item mlhs_node mlhs_post mlhs_inner
%type <id> fsym variable sym symbol operation operation2 operation3
@@ -1859,6 +1864,7 @@ op : '|' { ifndef_ripper($$ = '|'); }
| tUMINUS { ifndef_ripper($$ = tUMINUS); }
| tAREF { ifndef_ripper($$ = tAREF); }
| tASET { ifndef_ripper($$ = tASET); }
+ | tAREFBEG { ifndef_ripper($$ = tAREFBEG); }
| '`' { ifndef_ripper($$ = '`'); }
;
@@ -2576,6 +2582,7 @@ mrhs : args ',' arg_value
;
primary : literal
+ | sym_lambda
| strings
| xstring
| regexp
@@ -3528,6 +3535,39 @@ lambda_body : tLAMBEG compstmt '}'
}
;
+sym_lambda : literal paren_args
+ {
+ /*%%%*/
+ if (nd_type($1) == NODE_LIT ? SYMBOL_P($1->nd_lit) :
+ nd_type($1) == NODE_DSYM) {
+ ID mid = id__send__;
+ if (nd_type($1) == NODE_LIT) {
+ mid = SYM2ID($1->nd_lit);
+ }
+ else {
+ $2 = arg_prepend(NEW_LIST($1), $2);
+ }
+ $$ = symbol_lambda(mid, $2);
+ fixpos($$, $1);
+ }
+ else {
+ compile_error(PARSER_ARG "non-symbol lambda");
+ }
+ /*%
+ $$ = dispatch2(lambda, $1, $2);
+ %*/
+ }
+ | /*:'['*/ tAREFBEG { $<num>$ = ruby_sourceline; } aref_args ']'
+ {
+ /*%%%*/
+ $$ = symbol_lambda(tAREF, $3);
+ nd_set_line($$, $<num>2);
+ /*%
+ $$ = dispatch2(lambda, ripper_id2sym(tAREF), $3);
+ %*/
+ }
+ ;
+
do_block : keyword_do_block
{
$<vars>1 = dyna_push();
@@ -7304,6 +7344,11 @@ parser_yylex(struct parser_params *parser)
case '"':
lex_strterm = NEW_STRTERM(str_dsym, c, 0);
break;
+ case '[':
+ if (!peek(']')) {
+ lex_state = EXPR_BEG;
+ return tAREFBEG;
+ }
default:
pushback(c);
break;
@@ -8387,6 +8432,49 @@ arg_append_gen(struct parser_params *parser, NODE *node1, NODE *node2)
}
static NODE *
+arg_prepend_gen(struct parser_params *parser, NODE *node1, NODE *node2)
+{
+ const char *ruby_node_name(int);
+
+ if (!node1) return node2;
+ if (!node2) return node1;
+ switch (nd_type(node2)) {
+ case NODE_ARRAY:
+ return list_concat(node1, node2);
+ case NODE_BLOCK_PASS:
+ node2->nd_head = arg_prepend(node1, node2->nd_head);
+ return node2;
+ case NODE_SPLAT:
+ node2->nd_body = node2->nd_head;
+ node2->nd_head = node1;
+ nd_set_type(node2, NODE_ARGSCAT);
+ return node2;
+ case NODE_ARGSCAT:
+ node2->nd_head = arg_prepend(node1, node2->nd_head);
+ return node2;
+ case NODE_ARGSPUSH:
+ node2->nd_head = arg_prepend(node1, node2->nd_head);
+ return node2;
+ default:
+ compile_error(PARSER_ARG "unhandled node %s", ruby_node_name(nd_type(node2)));
+ return 0;
+ }
+}
+
+static NODE *
+symbol_lambda_gen(struct parser_params *parser, ID mid, NODE *args)
+{
+ const struct vtable *vars = dyna_push();
+ ID tid = internal_id();
+ NODE *lambda = NEW_LAMBDA(0);
+ arg_var(tid);
+ lambda->nd_body = NEW_SCOPE(new_args(NEW_ARGS_AUX(tid, 1), 0, 0, 0, 0),
+ NEW_CALL(NEW_DVAR(tid), mid, args));
+ dyna_pop(vars);
+ return lambda;
+}
+
+static NODE *
splat_array(NODE* node)
{
if (nd_type(node) == NODE_SPLAT) node = node->nd_head;
diff --git i/test/ruby/test_symbol.rb w/test/ruby/test_symbol.rb
index 9061f19..35c628c 100644
--- i/test/ruby/test_symbol.rb
+++ w/test/ruby/test_symbol.rb
@@ -88,6 +88,9 @@ class TestSymbol < Test::Unit::TestCase
ary_ids = ary.collect{|x| x.object_id }
assert_equal ary_ids, ary.collect(&:object_id)
end
+
+ assert_equal [2, 4, 6], (1..3).map(&:*(2))
+ assert_equal %w(b e h), %w[abc def ghi].map(&:[1])
end
def test_call