Shibuya.pm#12でLTしました

Shibuya.pm#12でLTしました。

perly.yをハックしてブロック付きメソッド呼び出しを可能にする,という話をしました。
たとえばこんなことができるようになります:

File->open('<', $foo){
  my($io) = @_;
  $io->grep{ /foo/ }->each{ say @_ };
};

まとめ:

  • perly.yを変更するとPerlの文法を変えられる
    • perly.yを変更したらmake regen_perlyを忘れずに
  • 高度に発達したPerlRubyと見分けがつかない

パッチ:

--- 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さんありがとうございました。お疲れ様でした。