記号だらけの 無名関数
Shinya Hayakawa TSURUMAU
Shibuya.pm #17 2015/06/02
ドキッ!
「lambda 完全解説」http://cpplover.blogspot.jp/2009/11/lambda.html
「lambdaの文法解説」int main(){ [] // [ lambda-capture ] () // ( parameter-declaration-clause ) {} // compound-statement () // Function call expression ;}
括弧のみ
[](){}
syntax OKsyntax OKsyntax OK
3 通り
括弧のペア
[][][]()[]{}
()[]()()(){}
{}[]{}(){}{}
3 x 3 = 9 通り
syntax errorsyntax errorsyntax error
syntax errorsyntax errorsyntax error
syntax errorsyntax errorsyntax error
list slice|'(' expr ')' '[' expr ‘]’…|'(' ')' '[' expr ‘]’!
- perly.y
scalar or list?
(LIST)[LIST]プログラミングPerl第3版 p.87
問題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に食われてしまっている