29092007 perl
括弧を使う
PATTERN が括弧を含んでいる場合、 delimiter 中でマッチする文字列からさらに配列要素が作り出される。
29092007 perl
29092007 chemoinformatics bioinformatics
今週は仕事がやたらと忙しかったり、送別だ歓迎だと飲みが重なったので思うように読みすすめられなかったが、7章はページ数が少ないのでなんとか読み終えた。
perlで高階関数をどうやるかって章。
クロージャを使ってカリー化するんだがそれだと関数っぽく呼べないのでglobを使う。というようなテクニカルな部分に関して解説。プロトタイプ宣言の部分とか良くわからなかったが、中盤以降あまり興味が持てなかったのでちゃんと読んでないような。
ちなみに、perlでカリー化するモジュールはSub::Curryってのがあります。
http://www.kzfmix.com/blosxom_archive/Computer/Linux/fpython060914.html
24092007 game
FFTは買う
とかいってFFTAは最後のあたりでとまっているが、、、、
久しぶりにやってみようか。
24092007 perl
型グロブで悩むの巻
*a = sub {1+2}
が$a->()でなくて
a() # 3
なのがいまいちわからない。
$ perlsh
main[82]$ $a = 5
5
main[83]$ $b = \$a
SCALAR(0x984e018)
main[84]$ *a
*main::a
main[85]$ *a{SCALAR}
SCALAR(0x984e018)
main[86]$ ${*a{SCALAR}}
5
main[87]$ $$b
5
ということは $b = \$a = *a{SCALAR}だからリファレンスベースで考えていけばいいのかな、、、、
$ $a = [1,2,3,4]
ARRAY(0x984e048)
main[89]$ @$a
1
2
3
4
main[90]$ *b = $a
*main::b
main[91]$ @b
1
2
3
4
とこんな感じ。
実用Perlプログラミングにグロブはハッシュを使って実装されてると書いてある。
main[92]$ $a = [1,2,3]
ARRAY(0x9989060)
main[93]$ $b = {a => 3}
HASH(0x99890c0)
main[94]$ *c = $a
*main::c
main[95]$ *c = $b
*main::c
main[96]$ @c
1
2
3
main[97]$ %c
a
3
なんかrefの型にマッチさせてハッシュっぽくしてる感じだ。
でもまだちゃんと掴みきってないナァ。あと第2版は1章に小難しい話題を入れてる割にはページが少ないのでちょっとアレ。実用Perlプログラミング的には一章100pぐらいあって充実されてるほうが嬉しい。
Higher-Order Perl 6章は無限ストリーム。SICPの3章あたりに対応してるので、SICPのcar,cdr,consで無限ストリームを扱うあたりを読んでいれば最初のほうはサクサク読めた。特にストリームの混ぜ合わせとかが面白い。
6.5がストリームを使ってREGEXから文字列を生成するという節。ここが結構わかりにくくて数ページずつくらいしか読み進められなかった。*(0回以上の繰り返し)の表現とか最初なかなか理解できなかったので、紙に書き下したりとかした。
6.6のNewton-Raphson MethodoもSICPで既に読んでたので、比較しながら読むと楽しい。ついでにループ判定の方法を使って数値の振動を発見する方法にふれてて面白かった。Gaucheクックブックの循環リストを扱うのアルゴリズム。
HOPの6章は無限ストリームを扱っているのだけれど、SICPの無限ストリームの章にあるエラトステネスの篩が出てこないので書いてみた。
HOPだとcar,cdr,consがそれぞれhead,tail,nodeとなってるのでそれにあわせてある。promiseは計算を遅延させるためのクロージャ。
use strict;
use warnings;
no warnings 'recursion';
sub promise (&) { $_[0] }
sub node{
my ($h, $t) = @_;
[$h, $t];
}
sub head {
my ($ls) = @_;
$ls->[0];
}
sub tail {
my ($ls) = @_;
if(is_promise($ls->[1])){
$ls->[1] = $ls->[1]->();
}
$ls->[1];
}
sub is_promise {
UNIVERSAL::isa($_[0],'CODE');
}
sub drop {
my $h = head($_[0]);
$_[0] = tail($_[0]);
return $h;
}
sub filter (&$) {
my $f = shift;
my $s = shift;
until(! $s || $f->(head($s))){
drop($s);
}
return if ! $s;
node(head($s),promise {filter($f, tail($s))});
}
sub sieve {
my $s = shift;
node(head($s),
promise {sieve(filter {$_[0] % head($s)} tail($s))});
}
sub upfrom {
my ($m) = @_;
node($m, promise{ upfrom($m+1)});
}
sub show {
my ($s,$n) = @_;
while($s && (! defined $n || $n-- > 0)){
print head($s), $";
$s = tail($s);
}
print $/;
}
my $primes = sieve(upfrom(2));
show($primes,300);
これで、素数のストリームが生成される。
Higher-order Perl: A Guide To Program Transformation無限ストリームは楽しい
22092007 life
見えない階段って上ったことのあるヒトにしか見えないよなぁと。
HOP6.5でなんだコレは?と。($_,@_)なんてありなのかと思ったがどうも違った。
sub test {
my ($h, @s) = grep $_, @_;
print "h:\t$h\n";
print "s:\t";
print join ",",@s,"\n";
}
test(3,undef,1,4,5);
実行結果
h: 3
s: 1,4,5,
配列の中からundefを除く、($_,@_)っていう配列ではなくて grep {$_} @_みたいな感じのgrep tipsだった。