HOP 8.8はバックトラッキング

継続(8.8.1)使ってやる方法と、パーサ自体に押し込む(8.8.2)方法がある。 SICPのambのところを後でもう一度読んでおく。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン
ピアソンエデュケーション / 4830円 ( 2000-02 )


なんていうかまだ継続をきちんと理解していないことが理解できた。

ProductName Higher-Order Perl: Transforming Programs with Programs
Mark Jason Dominus
Morgan Kaufmann / 5692円 ( 2005-03-28 )


HOP 8.4終了

8.3と8.4はほぼセット。8.4だけで40page越えなので読み応えがあるし、ちょっと疲れた。

算術的な表現(四則演算)のための字句解析器や構文解析器をperlで実装するわけだが、リスト表現って強力だと。

あとleft recursionを無限ストリームにしていくとことか凄い。

WebService::AudioscrobblerをAlbumに対応

WebService::Audioscrobblerってのがあるんだけど、Artist,Track,Tagにしか対応してないのでAlbumにも対応させてみた。

WebService-Audioscrobbler-wAlbum.tar.gz

use WebService::Audioscrobbler;

my $ws = WebService::Audioscrobbler->new;
my $user  = $ws->user('kzfm');

my @albums  = $user->albums;

for my $album (@albums) {
  print $album->name . ":". $album->asin . "\n" if defined $album->asin;
}

さて実行

$ perl wa.pl
Bricolage:B000003S7Y
Hospital Mix 4:B0006ULVZW
Think Tank:B0000931OG
Bass Is Maternal:B00004T90L
Tally Ho!:B00000D9VK
Emperor Tomato Ketchup:B000002HK2
Sweetbox:B00000AFYM
Bodily Functions:B00005B9JQ
Hand on the Torch:B000005HB8
Supergrass:B00004S95F
Temperamental:B00001QENY
Inside Life:B0000046KU
Lifeforms (disc 2):B000003RVR
Night Food:B0000677MF
Hail to the Thief:B000092ZYX
My Point of View:B0009XE874
The Understanding:B0009RQRP6
On:B000002BCA
Amnesiac:B00005B4GU
無罪モラトリアム:B00000JD1I

perlでλ

謎のモジュールがあがってた。

my $code = sub {...};

my $code = λ{...};

と書ける。

lambda

HOP 8.2

Higher-Order Perl 8章

地道に理解しながら。

my $parser = make_parser_for_grammer 'expression',
  {
   expression => [['INT', '+', 'expression'],
          ['INT', '*', 'expression'],
          ['(', 'expression', ')'],
          ['INT'],
          ],
   },
  ['(', 'INT', '*', '(', 'INT', '+', 'INT', ')', ')']
  ;

$childrenの$productionの@childをprint

INT,+,expression
INT,*,expression
(,expression,)
INT

##
(,INT,+,expression,)
(,INT,*,expression,)
(,(,expression,),)
(,INT,)

##
(,INT,*,INT,+,expression,)
(,INT,*,INT,*,expression,)
(,INT,*,(,expression,),)
(,INT,*,INT,)

##
(,INT,*,(,INT,+,expression,),)
(,INT,*,(,INT,*,expression,),)
(,INT,*,(,(,expression,),),)
(,INT,*,(,INT,),)

##
(,INT,*,(,INT,+,INT,+,expression,),)
(,INT,*,(,INT,+,INT,*,expression,),)
(,INT,*,(,INT,+,(,expression,),),)
(,INT,*,(,INT,+,INT,),)

childrenでとりあえずgrammarから生成できる子を生成しといてis_interestingでフィルタリング(DFS)

ProductName Higher-order Perl: A Guide To Program Transformation
Mark Jason Dominus
Morgan Kaufmann Pub / ¥ 7,588 (2005-05-30)
通常24時間以内に発送

8章から突然難易度が上がる気がする。

quotemetaはメタキャラクタをクゥオートする

HOPの8章がなかなかすすまん。3歩進んで2.5歩下がるというようなことを繰り返しているような。

8.1.1に出てくるquotemetaはメタ文字をクゥオートする組み込み関数

pirl @> quotemeta($/)
"\\\n"

と展開される。

この節は、ダイヤモンド演算子をエミュレートしつつ、更に$/の部分に正規表現を使えるようにするといった内容

ProductName Higher-order Perl: A Guide To Program Transformation
Mark Jason Dominus
Morgan Kaufmann Pub / ¥ 7,634 (2005-05-30)
通常24時間以内に発送

ここ三ヶ月のlast.fmのアルバムチャートをとってみる

last.fmの自分のアルバムチャート

use XML::Simple;
use LWP::Simple;
use XXX;

my $uri = 'http://ws.audioscrobbler.com/1.0/user/kzfm/topalbums.xml?type=3month';

my $response = LWP::Simple::get($uri);
if ($response){
  my $xml = XML::Simple->new->XMLin($response);
  XXX $xml;
}

ProductName With Voices
Ammoncontact
Ninja Tune / ¥ 2,744 (2006-05-22)
通常3~5週間以内に発送

ProductName Bricolage
Amon Tobin
Ninja Tune / ¥ 1,919 (1997-06-03)
通常6~8日以内に発送

ProductName Enemy of the Enemy
Asian Dub Foundation
EMI / ¥ 3,722 (2004-05-25)
通常7~9日以内に発送

ProductName HIGHVISION
スーパーカー
KRE / ¥ 3,059 (2002-04-24)
通常24時間以内に発送

ProductName CLOSER
MONDO GROSSO
フォーライフミュージックエンタテインメント / ¥ 3,059 (1997-08-21)


Regexでマッチした位置を返す

gオプションをつけておけばposという組み込み関数が使える

pirl @> $text = "abcde"
"abcde"

pirl @>  pos($text) if $text =~ /c/
undef

pirl @>  pos($text) if $text =~ /c/g
3

といまさらながら知った。

splitでデリミタも配列に含める

括弧を使う

日本語 perl texinfo - split

PATTERN が括弧を含んでいる場合、 delimiter 中でマッチする文字列からさらに配列要素が作り出される。

HOP 7章終了

今週は仕事がやたらと忙しかったり、送別だ歓迎だと飲みが重なったので思うように読みすすめられなかったが、7章はページ数が少ないのでなんとか読み終えた。

perlで高階関数をどうやるかって章。 

クロージャを使ってカリー化するんだがそれだと関数っぽく呼べないのでglobを使う。というようなテクニカルな部分に関して解説。プロトタイプ宣言の部分とか良くわからなかったが、中盤以降あまり興味が持てなかったのでちゃんと読んでないような。

ちなみに、perlでカリー化するモジュールはSub::Curryってのがあります。

http://www.kzfmix.com/blosxom_archive/Computer/Linux/fpython060914.html