5章まで読んだけど、(たいして理解してなかったので)もう一度最初から読んでみる。
Higher-order Perl: A Guide To Program TransformationMark Jason Dominus
Morgan Kaufmann Pub / ¥ 7,678 (2005-05-30)
通常24時間以内に発送
prefaceにこの本はSICPにインスパイアされて書いたでよって書いてあった。
5章まで読んだけど、(たいして理解してなかったので)もう一度最初から読んでみる。
Higher-order Perl: A Guide To Program Transformationprefaceにこの本はSICPにインスパイアされて書いたでよって書いてあった。
うーん、期待以上だった。
それにしてもU隊長の嗅覚と、手際の良さには感心する。美味しそうなとこみっけたけどドウよ?ってサイト見ながら話してたら次の日には予約してあった。
昨日の夜に、コースにするかワンプレートにするか非常に悩んだが、食べるタイミングをそろえるということでワンプレートにすることにした。
が、やっぱメニューを見ると気持ちが揺らぐ。 が、当初の予定通りワンプレートランチで。
今日の魚はサワラとのこと。美味いっていうよりは旨い感じのサワラ。ビシソワーズも旨かった。あと、サラダは美味しい。
ユッキー(娘)も黒米リゾットバクバク食べてた。
で、ユッキー用に頼んだお子様パスタがうますぎ。トマトソースのパスタなんだけど、なんか食感がいい粒々なやつが入ってんの。にんにくか玉葱なのかなとか思ったけど、わからんかった。あとのってるパセリが彩りっていうより苦味がいいアクセントになってて、パセリがあるとなしとじゃ大違いだよなと思わせる系。酸味と塩味のバランスが絶妙で僕が結構食べてしまったが、ユッキーも美味しそうに食べてた。
ところで、帰りにこのパスタをめぐってひと悶着あったわけだ。要するにお子様パスタに唐辛子が入ってることの是非についてなんだが。味のバランス考えたら唐辛子は少なくとも入ってなあかんやろというのが僕の意見なんだけど、U隊長(妻)は唐辛子の入ったパスタはサビ抜いてない寿司みたいなもんで子供用ではないと。彼女は辛いものに抵抗あるしそう思うのかなと思うんだけど次は注文する前に尋ねりゃいいじゃんってことで落ち着いた。
夜も子連れOKだったら、今度はグループで行きたいが、多分またランチ行くな。次はコース頂く。
後日このページを拝見されたシェフの方が説明してくださったのですが、パスタはお子様用の他に、ランチに追加という形も取れるようです(メニューに確かに書いてあった)。で、うちの子供がまだ小さかったので追加のほうとしてオーダーを受けたそうです(なので頂いたのはお子様パスタではなかったわけです。)。
私のほうでちゃんと子供用の注文だと確認すればよかったですね。というわけで訂正しておきます。
Gaucheのdisplayとprintってperlのprintとsayと似たような関係なんだろうか?と思った。
参考にしたサイト
継続渡しスタイルに載ってたcall-with-procedureをperlで。
sub call_with_procedure {
my ($exp,$proc) = @_;
$proc->($exp);
}
sub fact {
my $n = shift;
$n == 1 ? 1 : $n * fact($n-1);
}
print call_with_procedure(sub {2 * $_[0]}, sub {$_[0]->(fact(10))});
実行すると
$ perl curpr.pl
7257600
継続ってのはgaucheだと外に向いているようなものを内側にひっくり返す感があってなんか奇妙な感じがするが、いくつか書いてみてから継続の説明を読むと、なんかフムフム感が得られる。だけど、それをperlでやろうとするとひどく混乱するのはなぜだろうか?
sub {$_[0]->(fact(10))}->(sub {2 * $_[0]})
= {2 * $_[0]}->(fact(10))
= 2 * fact(10)
書き下してみるとこんな感じか、、、、
最初のsub{}->()ってコードはautoboxを使えば動きそうな気がするが、、、
実際にやってみることにした。
use autobox;
use autobox::Core;
sub fact {
my $n = shift;
$n == 1 ? 1 : $n * fact($n-1);
}
print sub {$_[0]->(fact(10))}->(sub {2 * $_[0]});
無名サブルーチンが第一引数に無名サブルーチンを取ってこれが引数にfact10の結果を取ってそれを二倍するっていう処理が実行される(はず)
$ perl abtest.pl
7257600
動いた!
call/ccの勉強してたのに、キモコードを動かすというあらぬ方向に行ってしまったが、ファーストクラスオブジェクトってのがなんだかわかったようなわからんようなホンワカした何かを得た感があったのでよしとしよう。
継続ブーム到来中。なんでも継続読みましたよ、何度も何度も読みまくりなのでなんども継続
もちろんperlでもやってみたくなるので、なんでも継続、Perl で。とか継続は力なり読みながら手を動かしてみた。
が、perlだと、クロージャの中の
my $dummy = $cont; # なぜか必要みたい。
ってのが何故必要なのかわからないし、なんでそんなへんなのがそこにあるのかが、凄い気になるのでデバッガで追いかけた。
該当行を
#my $dummy = $cont; # なぜか必要みたい。
として perl -dで起動してみるといつまでたっても終わらない。なんか無限ループしてるっぽい。mとnの値がどんどんでかくなっていってるみたいだし、、、、。デバッガじゃなくて何が渡されてるのかprintしてみる。
sub {
my ($n) = @_;
my $dummy = $cont; # なぜか必要みたい。
print "n: $n\n";
&leaf_count_cps ($tree->[1],
sub {
my ($m) = @_;
print "m: $m\n";
$cont->($n + $m);
});
});
とやってnとmを追いかけると、おまじない入りは
$ perl cont.pl # [["a", "b"], [["c", "d"], "e"]];
n: 1
m: 1
n: 2
n: 1
m: 1
n: 2
m: 1
m: 3
5
予想通りの挙動。
で、my $dummy = $contが評価されないようにしてみると
$ perl cont.pl# [["a", "b"], [["c", "d"], "e"]];
n: 1
m: 1
n: 2
m: 1
m: 3
n: 4
m: 1
m: 5
m: 7
...ずっと続く...
よくわからん。別に代入じゃなくて$contをprintしてもrefしても正常に実行されるので、クロージャの中に評価する式があることが重要みたいなんだけど、、、
4:実体をそのまま覚えるためには、サブルーチン内でもそのレキシカル変数が使われていなくてはならない。 (サブルーチン内にその変数がなければ、実質サブルーチンはその変数を知らないのと同じコトになる)
これとか関係あるのだろうか?
goto使った継続だとおまじないがいらないってのもまた謎なんだよなぁ。
31082007 chemoinformatics q-chem
30082007 SICP
遅延評価とか継続とかambとか。
ちょっとついてけなくて、問題も解かずにとりあえずざっと読んだ感じ。一度立ち止まって色々調べてもう一度戻ってくる。あと、知ってる言語での実装も追いかけながらきちんと理解する。
あと5章の意義がいまいちわからん。レジスタ計算機を実装するとどういいんだろう?そこまでわかってないと継続とかきちんと理解できなさそうだっていうのはなんとなく感じるんだけど。
(4章とかを)わかっているから、5章を読むことでさらに理解が深まるという章なのではなかろうかと。
かぶれ気味かなと思いつつも、指が勝手にOn Lispを注文した。
29082007 life
僕はスキルアップに重要なのは結局のところ、
に尽きるんではなかろうかと思ってイル。
検索力を広義に解釈すれば、知りたいことを知ってるヒトに教えてもらうという能力もリッパな検索力だろうなぁと思うような事があったので、そのとき考えたことをメモっておく。
教わるという行為は結局のところ、教える側に委ねられてるわけで、ヒトの知識とかノウハウをたいしたコストなしにもらうわけだから謙虚さが必要だ。だから、ヒトに教えを受けている最中なのに、ちょっとかじったぐらいの知識で「それは知ってる。むしろ僕の知りたいことは云々」とかいって話の腰を折ることを繰り返したりすれば、教えるほうも嫌になるだろうし、「ググれば君ならわかるから大丈夫!」なんて切り替えされるようになったらスキルアップの機会的に大きな損失だ。
「それは知ってる。むしろ僕の知りたいことは云々」と言いたくなる、つまり自分の期待している答えが返ってこない事自体、本人の問い合わせ能力の低さを露呈しているだけか、そもそも問い合わせるべき人間を間違えている(検索先を選ぶ能力が低い)のではなかろうか?と自問自答してみる必要があるだろう。
「ちゃんと教えてくれたら3分で済んだのに、ググって調べなきゃいけなかったので調べものに3時間かかった」は、 「検索能力が低いので3分で済むはずの仕事に3時間費やした」 と言い換えてもいいだろうし、「教わればわかる」というのは裏返せば「教わらなければわからない」だ。
そういう論理でいけば、教える側に
教えなきゃわからんやつは教えてもわからん
なんてのは十分アリかなとか思った。
28082007 Meadow
マイナスたたくとき右手の小指を少し伸ばすので打ちまくると指がつりそうになることがあるんだけど、単にストロークポジションが悪いだけなのか?なんか指が寝気味なだけの気もするが、、、
28082007 perl
単純なピボットがしたかった。
use Text::CSV::Simple;
my $file = shift;
my $parser = Text::CSV::Simple->new;
my @list = qw/cl1 cl2 cl3 cl4 cl5/;
$parser->field_map(@list);
my @data = $parser->read_file($file);
my $pivdata = {};
for my $d (@data){
for my $label (@list){
push @{$pivdata->{$label}},$d->{$label};
}
}
for my $label (@list){
print join ",", @{$pivdata->{$label}};
print "\n";
}