ポロリもあるよ!
記号だらけの	

無名関数
Shinya Hayakawa	

TSURUMAU
Shibuya.pm #17	

2015/06/02
ドキッ!
自己紹介
昔は Perl を使ってました
CPAN Authorではない
「lambda 完全解説」
http://cpplover.blogspot.jp/2009/11/lambda.html
「lambdaを定義しよう」
int main()	
{	
[](){} ;	
}
「lambdaを呼び出そう」
int main()	
{	
[](){}() ;	
}
「lambdaの文法解説」
int main()	
{	
[] // [ lambda-capture ]	
() // ( parameter-declaration-clause )	
{} // compound-statement	
() // Function call expression	
;	
}
Perlでもやりたく
なりますよね?
準備
括弧のみで可能な記述
syntax OKな項を探す
黒魔術には頼らない
括弧のみ
[]	
()	
{}
3 通り
括弧のみ
[]	
()	
{}
syntax OK
syntax OK
syntax OK
3 通り
括弧のペア
[][]	
[]()	
[]{}	
()[]	
()()	
(){}	
{}[]	
{}()	
{}{}
3 x 3 = 9 通り
括弧のペア
[][]	
[]()	
[]{}	
()[]	
()()	
(){}	
{}[]	
{}()	
{}{}
3 x 3 = 9 通り
syntax
error
syntax
error
syntax
error
syntax
error
syntax
error
syntax
error
syntax
error
syntax
error
syntax
error
注目
()[]
list slice
|'(' expr ')' '[' expr ‘]’	
…	
|'(' ')' '[' expr ‘]’	
!
- perly.y
修正後
()[()]
修正後
()[()]
syntax OK
我々は ()[()]を
手に入れました
ところで
scalar or list?
()[…]
ココ
scalar or list?
(LIST)[LIST]
プログラミングPerl第3版 p.87
問題1.1☆
print(	
("foo")[()]	
);
問題1.1☆
print(	
("foo")[()]	
);
→ ""
問題1.2☆☆
print scalar(	
("foo")[()]	
);
問題1.2☆☆
print scalar(	
("foo")[()]	
);
→ foo
解説
リストをリストコンテキスト以外で評価した時
のアレ。
カンマ演算子でスタックに積まれた値の最後
以外が捨てられる。


$x = ("a","b","c"); # $x="c"	
$x = ("a")[2,1,0]; # $x="a"
()は数値で…?
0+();	
	 " 0	
int(());	
	 " 0
解説
最後の値である()が数値で0と評価
され、リストの0番目の要素となる


$x = ("foo")[()];	
" $x = "foo"
応用
$x = ("foo")[()];	
$x = ("foo")[((()))];	
$x = ("foo")[(),(),()];
問題2.1☆☆☆
print(	
(sub{"foo"})[()]->()	
);
問題2.1☆☆☆
print(	
(sub{"foo"})[()]->()	
);
→ foo
問題2.2☆☆☆☆☆☆
print(	
(sub{"foo"})[()]->(1)	
);
問題2.2☆☆☆☆☆☆
print(	
(sub{"foo"})[()]->(1)	
);
→ Can't use an undefined value as a
subroutine reference
解説
print(	
(sub{"foo"})[()]->(1)	
);
スタックに積まれた関数呼び出し
の引数が、pp_lsliceに食われ
てしまっている
ここで
残念なお知らせ
無名関数について
CODEを生成するにはsub
キーワード必須
プロトタイプで&を使う…
括弧だけで関数の定義、
呼び出しはできない
まとめ
()[()] 記法
空リストの可能性
やっぱりPerl楽しいです!

ドキッ!記号だらけの無名関数