14092007 music
520ユーロか。なんか微妙な値段設定だな。でも欲しくなりそうだなあ。
14092007 music
520ユーロか。なんか微妙な値段設定だな。でも欲しくなりそうだなあ。
最後の式を評価して返す
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はなにやらPerlとかPythonっぽくて楽しいですな。毎日Gaucheクックブックを一つは読むようにしてわからないとこを調べながらというスタイルで。(まだ3日だけど日付順に読んでる)
いくつか簡単な例を示します。最初の例は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
09092007 SICP
Amazonに訳が悪いと散々書かれていて、ちょっと躊躇したのだけど、実際買って読んでみたら特に訳がひどいと思うことはなかった。
あと、原著読めばとか書いてあるのは、原著読めばって書く前に原著読むだろうから、そもそも訳が悪いとかすらいわんだろう。結局何であんなに訳が悪いというコメント気にしたのか今となってはさっぱりわからん。日本語訳より原著で読んだほうがよくわかって良いというレビューがなかったのもいまとなってはフーンとか思う。Amazonの訳が悪いってのは何の裏返しなのかよく考えないといけないのかもと、いまさら学んだ。
訳が良かったらもっと早く飲み込めるかというと、そういうもんではない気もするし。
僕的には買って良かったと思える本の一つ。
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"を入れておくときちんとキャッシュが効くと。
Higher-order Perl: A Guide To Program TransformationHOPではOrcish maneuverに絡めてあって、3章はこの部分が一番面白かった。4章はイテレータ、この章に100p近く割いてある。
09092007 life
let1って何だろうって思ったので。
let1 var expr body …
変数が一つしか無い場合の便利なマクロです。次のように展開されます。
(let ((var expr)) body …)
07092007 Scheme
1章から12章まで割と一気目で。
以下覚書
Gauche ユーザリファレンス: 2.4 大文字小文字の区別
Lisp系の言語は歴史的にシンボルの大文字小文字を区別していませんでした。 Schemeもその流れを汲んでおり、R5RSでもシンボルは読み込まれる時に大文字小文字の区別をしないと定義されています。(但し、R5RSの範囲内でも処理系内部では大文字小文字を区別することになってます。ここで問題としているのは読み込み時の動作です。)
しかし現在では、プログラミングが一つの言語で完結することは滅多にありません。他の言語とインタフェースを取る場合、Scheme側でも大文字小文字を区別するようにしておいた方が便利です。
gosh -fcase-fold
で大文字小文字を区別しないモード
クダー
カー、シーディーアールって読んでた。
局所変数(ローカル変数)を定義する let, let*, letrec という構文もあります
letrecをいまいち理解しないでSICP読んでた。
コンパイル済Windows用バイナリだと日本語が化けたがどうすればいいのかちょっと見つからなかった。
gosh> (gauche-character-encoding)
utf-8
内部文字エンコーディングはUTF-8
Gaucheクックブックを一日ひとつ見ていけば3ヶ月以上楽しめてナイス。