Shibuya.pm#12でLTしました
Shibuya.pm#12でLTしました。
perly.yをハックしてブロック付きメソッド呼び出しを可能にする,という話をしました。
たとえばこんなことができるようになります:
File->open('<', $foo){ my($io) = @_; $io->grep{ /foo/ }->each{ say @_ }; };
まとめ:
パッチ:
--- perly.y 2009-11-29 18:04:19.000000000 +0900 +++ perly-new.y 2009-11-29 19:49:50.000000000 +0900 @@ -732,12 +732,33 @@ TOKEN_GETMAD($4,$$,'('); TOKEN_GETMAD($6,$$,')'); } + | term ARROW method '(' listexprcom ')' startanonsub block /* $foo->bar(list) { ... } */ + { SvREFCNT_inc_simple_void(PL_compcv); + $$ = convert(OP_ENTERSUB, OPf_STACKED, + append_elem(OP_LIST, + append_elem(OP_LIST, + prepend_elem(OP_LIST, scalar($1), $5), + newANONATTRSUB($7, NULL, NULL, $8)), + newUNOP(OP_METHOD, 0, $3))); + TOKEN_GETMAD($2,$$,'A'); + TOKEN_GETMAD($4,$$,'('); + TOKEN_GETMAD($6,$$,')'); + } | term ARROW method /* $foo->bar */ { $$ = convert(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST, scalar($1), newUNOP(OP_METHOD, 0, $3))); TOKEN_GETMAD($2,$$,'A'); } + | term ARROW method startanonsub block /* $foo->bar { ... } */ + { SvREFCNT_inc_simple_void(PL_compcv); + $$ = convert(OP_ENTERSUB, OPf_STACKED, + append_elem(OP_LIST, + append_elem(OP_LIST, scalar($1), + newANONATTRSUB($4, NULL, NULL, $5)), + newUNOP(OP_METHOD, 0, $3))); + TOKEN_GETMAD($2,$$,'A'); + } | METHOD indirob listexpr /* new Class @args */ { $$ = convert(OP_ENTERSUB, OPf_STACKED, append_elem(OP_LIST,
id:TAKESAKOさんありがとうございました。お疲れ様でした。