67
高階Perl 2/19 Hokkaido.pm #4 @havanaclub 2011219日土曜日

Higher order perl

Embed Size (px)

DESCRIPTION

Hokkaido.pm #4

Citation preview

Page 1: Higher order perl

高階Perl2/19 Hokkaido.pm #4

@havanaclub

2011年2月19日土曜日

Page 2: Higher order perl

早いもので #4

2011年2月19日土曜日

Page 3: Higher order perl

ところで

2011年2月19日土曜日

Page 4: Higher order perl

プログラマの生涯

2011年2月19日土曜日

Page 5: Higher order perl

プログラマの生涯•OOP期

2011年2月19日土曜日

Page 6: Higher order perl

プログラマの生涯•OOP期•クロージャ期

2011年2月19日土曜日

Page 7: Higher order perl

プログラマの生涯•OOP期•クロージャ期•メタプログラミング期

2011年2月19日土曜日

Page 8: Higher order perl

プログラマの生涯•OOP期•クロージャ期•メタプログラミング期• DSL期

2011年2月19日土曜日

Page 9: Higher order perl

プログラマの生涯•OOP期•クロージャ期•メタプログラミング期• DSL期•もうなんでもいいや……期

2011年2月19日土曜日

Page 10: Higher order perl

プログラマの生涯•OOP期

2011年2月19日土曜日

Page 11: Higher order perl

プログラマの生涯•OOP期•とにかくオブジェクトな感じ

2011年2月19日土曜日

Page 12: Higher order perl

プログラマの生涯•OOP期•とにかくオブジェクトな感じ• Smalltalkにかぶれた

2011年2月19日土曜日

Page 13: Higher order perl

プログラマの生涯•OOP期•とにかくオブジェクトな感じ• Smalltalkにかぶれた• GOF! Kent Beck! ふげふご

2011年2月19日土曜日

Page 14: Higher order perl

プログラマの生涯•OOP期の終焉

2011年2月19日土曜日

Page 15: Higher order perl

プログラマの生涯•OOP期の終焉•謎のクラスファイルの大伽藍

2011年2月19日土曜日

Page 16: Higher order perl

プログラマの生涯•OOP期の終焉•謎のクラスファイルの大伽藍•このファイルなんだっけ……

2011年2月19日土曜日

Page 17: Higher order perl

プログラマの生涯•OOP期の終焉•謎のクラスファイルの大伽藍•このファイルなんだっけ……•抽象化しすぎてなんか必要な手続きがかえって増えたような……

2011年2月19日土曜日

Page 18: Higher order perl

プログラマの生涯•クロージャ期

2011年2月19日土曜日

Page 19: Higher order perl

プログラマの生涯•クロージャ期•とにかくクロージャ

2011年2月19日土曜日

Page 20: Higher order perl

プログラマの生涯•クロージャ期•とにかくクロージャ• Paul Grahumにかぶれた

2011年2月19日土曜日

Page 21: Higher order perl

プログラマの生涯•クロージャ期•とにかくクロージャ• Paul Grahamにかぶれた•関数合成!部分適用!memoize!ふげふご

2011年2月19日土曜日

Page 22: Higher order perl

プログラマの生涯•クロージャ期の終焉

2011年2月19日土曜日

Page 23: Higher order perl

プログラマの生涯•クロージャ期の終焉•デバッグしにくい……

2011年2月19日土曜日

Page 24: Higher order perl

プログラマの生涯•クロージャ期の終焉•デバッグしにくい……•実行時に関数を作るのでスタックトレースに関数の名前が出てこない

2011年2月19日土曜日

Page 25: Higher order perl

プログラマの生涯•クロージャ期の終焉•デバッグしにくい……•実行時に関数を作るのでスタックトレースに関数の名前が出てこない

•まじきびしい

2011年2月19日土曜日

Page 26: Higher order perl

まとめ

2011年2月19日土曜日

Page 27: Higher order perl

There is no silver bullet

2011年2月19日土曜日

Page 28: Higher order perl

高階Perlの話は?

2011年2月19日土曜日

Page 29: Higher order perl

高階Perl• Higher Order Perl• Marks Jason Dominus, 2005• http://hop.perl.plover.com/book/

2011年2月19日土曜日

Page 30: Higher order perl

中身•ぶっちゃけSICPをPerlで書き直しただけ

2011年2月19日土曜日

Page 31: Higher order perl

関数型プログラミングっぽく

2011年2月19日土曜日

Page 32: Higher order perl

関数型プログラミング言語• 関数がfirst-class• first-class = 関数を変数に代入(束縛)したり関数の引数に出来る

• Perl:関数をfirst-classで扱えるので関数型っぽいことも容易

2011年2月19日土曜日

Page 33: Higher order perl

関数の代入?

2011年2月19日土曜日

Page 34: Higher order perl

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

変数のとじこみuse strict;my $c = 3my $add = sub { $_[0] + $c};

$add->(4);# => 7

変数$cをクロージャ内にとじ込んで後から参照できるようにする

2011年2月19日土曜日

Page 36: Higher order perl

変数の値をクロージャ内で更新すると?

use strict;my $c = 3my $proc = sub { $c++ };

$proc->();# 3$proc->();# 4$proc->();# 5

変数$cの内容が更新されている

2011年2月19日土曜日

Page 37: Higher order perl

普通の関数も変数に入れてみる

use strict;

sub add { $_[0] + $_[1]; }

my $func = ¥&add;$func->(3, 4);# => 7

¥&関数名で関数の参照をとれる

2011年2月19日土曜日

Page 38: Higher order perl

クロージャを作る関数

use strict;# 引数を足し算する関数を返すsub generate { my ($a, $b) = @_; sub { $a + $b };}

generate(3, 4)->();# => 7

2011年2月19日土曜日

Page 39: Higher order perl

クロージャを作る関数(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

どういう役に立つの?

2011年2月19日土曜日

Page 41: Higher order perl

1.コールバック

2011年2月19日土曜日

Page 42: Higher order perl

ファイルの各行を処理

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

呼び出し側の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

2.関数テーブル

2011年2月19日土曜日

Page 45: Higher order perl

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

3.関数のカスタマイズ

2011年2月19日土曜日

Page 47: Higher order perl

ロガーのカスタマイズ

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

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

4.イテレータ

2011年2月19日土曜日

Page 50: Higher order perl

コンテナの要素を順繰りに取得

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

5.遅延評価

2011年2月19日土曜日

Page 52: Higher order perl

無限リスト

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

閑話休題

2011年2月19日土曜日

Page 54: Higher order perl

変数scoping•レキシカルスコープ•my•ダイナミックスコープ• local

2011年2月19日土曜日

Page 55: Higher order perl

レキシカルスコープ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

ダイナミックスコーlocal $var = 12;

sub func { say $var;}

sub test { local $var = 19; func();}

test(); # => 19func(); # => 12

呼び出しスコープ内で直近の変数が使われる2011年2月19日土曜日

Page 57: Higher order perl

更なる深み

2011年2月19日土曜日

Page 58: Higher order perl

更なる深み•パーサコンビネータ

2011年2月19日土曜日

Page 59: Higher order perl

更なる深み•パーサコンビネータ•インタプリタ作り

2011年2月19日土曜日

Page 60: Higher order perl

更なる深み•パーサコンビネータ•インタプリタ作り•宣言型プログラミング

2011年2月19日土曜日

Page 61: Higher order perl

更なる深み•パーサコンビネータ•インタプリタ作り•宣言型プログラミング•ラムダ計算

2011年2月19日土曜日

Page 62: Higher order perl

更なる深み•パーサコンビネータ•インタプリタ作り•宣言型プログラミング•ラムダ計算

2011年2月19日土曜日

Page 63: Higher order perl

普通にSchemeとかでやった方が……

Scheme!Scheme!

2011年2月19日土曜日

Page 64: Higher order perl

まとめ

2011年2月19日土曜日

Page 65: Higher order perl

クロージャの用量用法を守って使いましょう

2011年2月19日土曜日

Page 66: Higher order perl

参考資料•Higher Order Perl• Structure and Interpretation of Computer Programming

•論理と計算の仕組み• Guy Steele’s Lambda papers(おすすめ)

2011年2月19日土曜日

Page 67: Higher order perl

おまけ

SICP読書会やりたい(hotさんも参加してくれそう)

2011年2月19日土曜日