HOP 4章終了

Higher-Order Perlの4章は100pageに及ぶイテレータの章。

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

4.3.1のpermutationのところがかなり面白い。組み合わせをシーケンスにするとことか基底を列ごとに変える部分とか。4.3.2はゲノム配列の組み合わせ問題で懐かしさ満開、といっても僕はそのころはEMBOSSとかに頼っていたのであまりそういう問題に関して深く考えたことなかったな(既にツールとして色々あったし、、、)

4.4でイテレータ版のmapとgrep。これは色々と楽しそう。Iterator::Utilというモジュールがある。

後半は読み物色が強くなってて、イテレータの終わりとSQLでいうNULLにあたるものをどう区別していくかみたいな。一番最後にweb spideringの例が示してあってigrepとimapがかなりいい感じ。

HOP 4.5.7

Higher-Order Perl

hash,arrayのほかにクロージャもblessできる。

Perl におけるオブジェクト指向

Perl のオブジェクトを作るときは、まず組み込みのデータ型から適当なものを選びます。普通はハッシュを使うことが多いと思いますが、配列やクロージャ(無名サブルーチン)もオブジェクトに出来ます。

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

いくつかのアクションを持つイテレータを用意したとき

$it->('next');

とか書かないといけないところを

sub Iter::next {$_[0]->('next')}

というような関数を用意する。更に、イテレータを受け取ってblessして返す関数を適用。

sub Iterator (&) { bless $_[0] => 'Iter'}

そうすると、

$it->next

というようなメソッド風呼び出しが行え、一種の構文糖衣的な使い方と考えておけばよいのだろう。

HOP 4.4.4

Higher Order Perlのappend()

  • listをイテレータにする関数を作る
  • イテレータをいくつかリストに突っ込む
  • さっきのlistをイテレータにする関数を使ってイテレータの詰まったリストをイテレータに

イテレータのappendの完成。素晴らしい。この流れでイテレータのzipとかもやれそう。

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

PacemakerのPre-booking

520ユーロか。なんか微妙な値段設定だな。でも欲しくなりそうだなあ。

Gaucheのbeginはperlのdo

最後の式を評価して返す

perlでfunc {}

func {なんかコード} = func(sub {なんかコード})の略らしい

sub Testfunc (&){return $_[0]->();}
Testfunc {print "hello kzfm"};

これはうまく動くが(&)がないと

sub Testfunc {return $_[0]->();}
Testfunc {print "hello kzfm"};

下のようなエラーが出る。

Not a CODE reference at test.pl line 1.

デバッガ動かしてみると先にTestfunc {print "hello kzfm"}がブロックとして評価されて、その後Testfunc {return $_[0]->();}が評価されるので$_[0]がコードブロックじゃないといわれているようだ。

プロトタイプで(&)ってことはコードブロック受け取ってるってことだよな。無名関数ってコードブロックか、、、あーなんとなくわかってきた気が。やっと{}がlispの括弧に見えてきた。

Gaucheの引数

GaucheはなにやらPerlとかPythonっぽくて楽しいですな。毎日Gaucheクックブックを一つは読むようにしてわからないとこを調べながらというスタイルで。(まだ3日だけど日付順に読んでる)

3.3 Schemeスクリプトを書く

いくつか簡単な例を示します。最初の例はUnixのcat(1)コマンドを模するものです。エラー処理やコマンドラインオプションの処理は行っていません。

#!/usr/bin/env gosh

(define (main args)   ;entry point
  (if (null? (cdr args))
...

(cdr args)ってことはperlの$0みたいに(car args)もプログラム自身の名前を返すのかも。

(define (main args)
(print "car:\t" (car args))
(print "pname:\t" *program-name*))

program-nameはスクリプトファイル名に束縛されるらしい。

$gosh test.scm
car:    test.scm
pname:  test.scm

SICPの訳

Amazonに訳が悪いと散々書かれていて、ちょっと躊躇したのだけど、実際買って読んでみたら特に訳がひどいと思うことはなかった。

あと、原著読めばとか書いてあるのは、原著読めばって書く前に原著読むだろうから、そもそも訳が悪いとかすらいわんだろう。結局何であんなに訳が悪いというコメント気にしたのか今となってはさっぱりわからん。日本語訳より原著で読んだほうがよくわかって良いというレビューがなかったのもいまとなってはフーンとか思う。Amazonの訳が悪いってのは何の裏返しなのかよく考えないといけないのかもと、いまさら学んだ。

訳が良かったらもっと早く飲み込めるかというと、そういうもんではない気もするし。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン,ジュリー サスマン,ハロルド エイブルソン
ピアソンエデュケーション / ¥ 4,830 (2000-02)
通常24時間以内に発送

僕的には買って良かったと思える本の一つ。

perlの0e0は真だけど0

HOP3章終了。

"0e0"の使いどころがなかなか。

論理演算

$ "0e0" || 1
0e0
$ 0 || 1 
1

真と判定、で演算してみる。

$ "0e0" * 5
0
$ "0e0" + 5
5
$ "0e0" - 5
-5

数値だ

$ "0e0" == 0
1
$ "0e0" eq 0

論理演算で真を返すのに0

で、これがどう便利かというと

$cached{$key} ||= make_cache($key)

キャッシュに0が入ってる場合偽と判定されてしまい、キャッシュがあるのに再計算してしまうのだけど"0e0"を入れておくときちんとキャッシュが効くと。

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

HOPではOrcish maneuverに絡めてあって、3章はこの部分が一番面白かった。4章はイテレータ、この章に100p近く割いてある。

はなめん棒

はなめん棒

富士五湖道路の須走ICのすぐ近くに、うどん屋さんがあるというので、行ってみることにした。

IMG_1289

わかりやすい立地。

ざるうどんはなめらかなのにこしがある。ニュルッとした喉越しがうまい。

ざる IMG_1293

たぬきにぎりは味付け天かす入りおにぎり。これも美味。

たぬきにぎり

満足