higher order perl
DESCRIPTION
Hokkaido.pm #4TRANSCRIPT
![Page 1: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/1.jpg)
高階Perl2/19 Hokkaido.pm #4
@havanaclub
2011年2月19日土曜日
![Page 2: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/2.jpg)
早いもので #4
2011年2月19日土曜日
![Page 3: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/3.jpg)
ところで
2011年2月19日土曜日
![Page 4: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/4.jpg)
プログラマの生涯
2011年2月19日土曜日
![Page 5: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/5.jpg)
プログラマの生涯•OOP期
2011年2月19日土曜日
![Page 6: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/6.jpg)
プログラマの生涯•OOP期•クロージャ期
2011年2月19日土曜日
![Page 7: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/7.jpg)
プログラマの生涯•OOP期•クロージャ期•メタプログラミング期
2011年2月19日土曜日
![Page 8: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/8.jpg)
プログラマの生涯•OOP期•クロージャ期•メタプログラミング期• DSL期
2011年2月19日土曜日
![Page 9: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/9.jpg)
プログラマの生涯•OOP期•クロージャ期•メタプログラミング期• DSL期•もうなんでもいいや……期
2011年2月19日土曜日
![Page 10: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/10.jpg)
プログラマの生涯•OOP期
2011年2月19日土曜日
![Page 11: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/11.jpg)
プログラマの生涯•OOP期•とにかくオブジェクトな感じ
2011年2月19日土曜日
![Page 12: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/12.jpg)
プログラマの生涯•OOP期•とにかくオブジェクトな感じ• Smalltalkにかぶれた
2011年2月19日土曜日
![Page 13: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/13.jpg)
プログラマの生涯•OOP期•とにかくオブジェクトな感じ• Smalltalkにかぶれた• GOF! Kent Beck! ふげふご
2011年2月19日土曜日
![Page 14: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/14.jpg)
プログラマの生涯•OOP期の終焉
2011年2月19日土曜日
![Page 15: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/15.jpg)
プログラマの生涯•OOP期の終焉•謎のクラスファイルの大伽藍
2011年2月19日土曜日
![Page 16: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/16.jpg)
プログラマの生涯•OOP期の終焉•謎のクラスファイルの大伽藍•このファイルなんだっけ……
2011年2月19日土曜日
![Page 17: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/17.jpg)
プログラマの生涯•OOP期の終焉•謎のクラスファイルの大伽藍•このファイルなんだっけ……•抽象化しすぎてなんか必要な手続きがかえって増えたような……
2011年2月19日土曜日
![Page 18: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/18.jpg)
プログラマの生涯•クロージャ期
2011年2月19日土曜日
![Page 19: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/19.jpg)
プログラマの生涯•クロージャ期•とにかくクロージャ
2011年2月19日土曜日
![Page 20: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/20.jpg)
プログラマの生涯•クロージャ期•とにかくクロージャ• Paul Grahumにかぶれた
2011年2月19日土曜日
![Page 21: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/21.jpg)
プログラマの生涯•クロージャ期•とにかくクロージャ• Paul Grahamにかぶれた•関数合成!部分適用!memoize!ふげふご
2011年2月19日土曜日
![Page 22: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/22.jpg)
プログラマの生涯•クロージャ期の終焉
2011年2月19日土曜日
![Page 23: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/23.jpg)
プログラマの生涯•クロージャ期の終焉•デバッグしにくい……
2011年2月19日土曜日
![Page 24: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/24.jpg)
プログラマの生涯•クロージャ期の終焉•デバッグしにくい……•実行時に関数を作るのでスタックトレースに関数の名前が出てこない
2011年2月19日土曜日
![Page 25: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/25.jpg)
プログラマの生涯•クロージャ期の終焉•デバッグしにくい……•実行時に関数を作るのでスタックトレースに関数の名前が出てこない
•まじきびしい
2011年2月19日土曜日
![Page 26: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/26.jpg)
まとめ
2011年2月19日土曜日
![Page 27: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/27.jpg)
There is no silver bullet
2011年2月19日土曜日
![Page 28: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/28.jpg)
高階Perlの話は?
2011年2月19日土曜日
![Page 29: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/29.jpg)
高階Perl• Higher Order Perl• Marks Jason Dominus, 2005• http://hop.perl.plover.com/book/
2011年2月19日土曜日
![Page 30: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/30.jpg)
中身•ぶっちゃけSICPをPerlで書き直しただけ
2011年2月19日土曜日
![Page 31: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/31.jpg)
関数型プログラミングっぽく
2011年2月19日土曜日
![Page 32: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/32.jpg)
関数型プログラミング言語• 関数がfirst-class• first-class = 関数を変数に代入(束縛)したり関数の引数に出来る
• Perl:関数をfirst-classで扱えるので関数型っぽいことも容易
2011年2月19日土曜日
![Page 33: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/33.jpg)
関数の代入?
2011年2月19日土曜日
![Page 34: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/34.jpg)
Perlでのクロージャuse strict;# クロージャを作って変数に束縛my $add = sub { $_[0] + $_[1] };
# 呼び出し$add->(3, 4);# => 7
vsuse strict;
sub add { $_[0] + $_[1]; }
add(2,4);
2011年2月19日土曜日
![Page 35: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/35.jpg)
変数のとじこみuse strict;my $c = 3my $add = sub { $_[0] + $c};
$add->(4);# => 7
変数$cをクロージャ内にとじ込んで後から参照できるようにする
2011年2月19日土曜日
![Page 36: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/36.jpg)
変数の値をクロージャ内で更新すると?
use strict;my $c = 3my $proc = sub { $c++ };
$proc->();# 3$proc->();# 4$proc->();# 5
変数$cの内容が更新されている
2011年2月19日土曜日
![Page 37: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/37.jpg)
普通の関数も変数に入れてみる
use strict;
sub add { $_[0] + $_[1]; }
my $func = ¥&add;$func->(3, 4);# => 7
¥&関数名で関数の参照をとれる
2011年2月19日土曜日
![Page 38: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/38.jpg)
クロージャを作る関数
use strict;# 引数を足し算する関数を返すsub generate { my ($a, $b) = @_; sub { $a + $b };}
generate(3, 4)->();# => 7
2011年2月19日土曜日
![Page 39: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/39.jpg)
クロージャを作る関数(2)use strict;use feature qw(say);
# 引数を足し算する関数を返すsub generate { my ($num) = @_; sub { $num++ };}
my $fun = generate(2);
say $fun->(); # => 2say $fun->(); # => 3
my $fun2 = generate(2);
say $fun2->(); # => 2say $fun2->(); # => 3
2011年2月19日土曜日
![Page 40: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/40.jpg)
どういう役に立つの?
2011年2月19日土曜日
![Page 41: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/41.jpg)
1.コールバック
2011年2月19日土曜日
![Page 42: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/42.jpg)
ファイルの各行を処理
use strict;
sub each_line { my ($file, $proc) = @_; open my $fh “<$file” or return; while(my $line = <$fh>) { $proc->($line); } close($fh);}
each_line(‘aaa.txt’, sub { print $_[0] } );
2011年2月19日土曜日
![Page 43: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/43.jpg)
呼び出し側のsubをなくす
use strict;
sub each_line (&@) { my ($proc, $file) = @_; open my $fh, "<$file" or return; while(my $line = <$fh>) { $proc->($line); } close($fh);}
each_line { print $_[0]; } ('lex.pl') ;
2011年2月19日土曜日
![Page 44: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/44.jpg)
2.関数テーブル
2011年2月19日土曜日
![Page 45: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/45.jpg)
dispatch table(switch代替)
use strict;
my $table = { ‘left’ => sub { print ‘left’ }, ‘right’ => sub { print ‘right’ },};sub dispatch { my ($mode) = @_; my $func = $table->{$mode}; $func && $func->();}dispatch(‘left’);
2011年2月19日土曜日
![Page 46: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/46.jpg)
3.関数のカスタマイズ
2011年2月19日土曜日
![Page 47: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/47.jpg)
ロガーのカスタマイズ
use strict;use Log::Dispatch;
my $logger = Log::Dispatch->new;sub generate_logger { my ($ip) = @_; sub { $logger->info(“$ip : $_[0]“) };}
$custom_logger = generate_logger(‘192.168.1.1’);
$custom_logger->(“msssssg”)# => “192.168.1.1 : msssssssg”
2011年2月19日土曜日
![Page 48: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/48.jpg)
Partial Application(部分適用)
sub patial_add { my ($a) = @_;
sub { add( $a + $_[0] ) };}
sub add { $_[0] + $_[1];}
my $func = patial_add(2);$func->(5);# => 7
2011年2月19日土曜日
![Page 49: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/49.jpg)
4.イテレータ
2011年2月19日土曜日
![Page 50: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/50.jpg)
コンテナの要素を順繰りに取得
use strict;
package Collection;sub new { my $class = shift; bless {data => \@_}, $class; }sub iter { my $self = shift; my $counter = 0; sub { $self->{data}[$counter++] };}
package main;my $iter = Collection->new(1, 2)->iter;say $iter->(); # => 1say $iter->(); # => 2
2011年2月19日土曜日
![Page 51: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/51.jpg)
5.遅延評価
2011年2月19日土曜日
![Page 52: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/52.jpg)
無限リスト
use strict;use feature qw(say);
# 1 .. 無限の整数列を生成my $infinite_list = sub { my $c = 1; sub { $c++; } };
# 整数列の最初から100番目までを表示my $num_list = $infinite_list->();for my $i (0..100) { say $num_list->();}
2011年2月19日土曜日
![Page 53: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/53.jpg)
閑話休題
2011年2月19日土曜日
![Page 54: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/54.jpg)
変数scoping•レキシカルスコープ•my•ダイナミックスコープ• local
2011年2月19日土曜日
![Page 55: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/55.jpg)
レキシカルスコープmy $var = 12;
sub func { say $var;}
sub test { my $var = 19; func();}
test(); # => 12 func(); # => 12
定義時の変数が使われる
2011年2月19日土曜日
![Page 56: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/56.jpg)
ダイナミックスコーlocal $var = 12;
sub func { say $var;}
sub test { local $var = 19; func();}
test(); # => 19func(); # => 12
呼び出しスコープ内で直近の変数が使われる2011年2月19日土曜日
![Page 57: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/57.jpg)
更なる深み
2011年2月19日土曜日
![Page 58: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/58.jpg)
更なる深み•パーサコンビネータ
2011年2月19日土曜日
![Page 59: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/59.jpg)
更なる深み•パーサコンビネータ•インタプリタ作り
2011年2月19日土曜日
![Page 60: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/60.jpg)
更なる深み•パーサコンビネータ•インタプリタ作り•宣言型プログラミング
2011年2月19日土曜日
![Page 61: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/61.jpg)
更なる深み•パーサコンビネータ•インタプリタ作り•宣言型プログラミング•ラムダ計算
2011年2月19日土曜日
![Page 62: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/62.jpg)
更なる深み•パーサコンビネータ•インタプリタ作り•宣言型プログラミング•ラムダ計算
2011年2月19日土曜日
![Page 63: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/63.jpg)
普通にSchemeとかでやった方が……
Scheme!Scheme!
2011年2月19日土曜日
![Page 64: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/64.jpg)
まとめ
2011年2月19日土曜日
![Page 65: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/65.jpg)
クロージャの用量用法を守って使いましょう
2011年2月19日土曜日
![Page 66: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/66.jpg)
参考資料•Higher Order Perl• Structure and Interpretation of Computer Programming
•論理と計算の仕組み• Guy Steele’s Lambda papers(おすすめ)
2011年2月19日土曜日
![Page 67: Higher order perl](https://reader033.vdocuments.site/reader033/viewer/2022052523/556a47b8d8b42a4a1e8b4eae/html5/thumbnails/67.jpg)
おまけ
SICP読書会やりたい(hotさんも参加してくれそう)
2011年2月19日土曜日