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

37
ポロリもあるよ!

Upload: shinya-hayakawa

Post on 04-Aug-2015

1.641 views

Category:

Technology


6 download

TRANSCRIPT

ポロリもあるよ!

記号だらけの 無名関数

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 OKsyntax OKsyntax OK

3 通り

括弧のペア

[][][]()[]{}

()[]()()(){}

{}[]{}(){}{}

3 x 3 = 9 通り

括弧のペア

[][][]()[]{}

()[]()()(){}

{}[]{}(){}{}

3 x 3 = 9 通り

syntax errorsyntax errorsyntax error

syntax errorsyntax errorsyntax error

syntax errorsyntax errorsyntax 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楽しいです!