やっと読み終わった。
19章の継続のところのcall/cc、コルーチンの話と、26章の自前で簡易HTTPサーバーを作るところが面白かった。
また、(SICPと違って)文字列処理とかモジュールの話などの実用性に重きをおいた部分がよくまとまってperlのように使える気にさせられる。
perlからruby,pythonに移ったって話は聞くけど、perl,ruby,pythonからgaucheに移ったっていうヒトはいるんだろうか?
やっと読み終わった。
19章の継続のところのcall/cc、コルーチンの話と、26章の自前で簡易HTTPサーバーを作るところが面白かった。
また、(SICPと違って)文字列処理とかモジュールの話などの実用性に重きをおいた部分がよくまとまってperlのように使える気にさせられる。
perlからruby,pythonに移ったって話は聞くけど、perl,ruby,pythonからgaucheに移ったっていうヒトはいるんだろうか?
16032008 Gauche
めくると興味がこっちに移ってしまいそうだ。
というわけで、泣く泣くちょっとの間封印することにした。熟成?
08032008 Gauche
pydevcampの真っ最中ではあったが、amazonで買えるようになったよというエントリを目にして早速注文
NodeBoxをSchemeで動かすという野望を耳にした。楽しみー。
というか、mac買わんとあかんなmacbook
02022008 Gauche
分かったような分からんような状態だったが。
gosh> (let ((x 2) (y 3))
(let* ((x 7) (z (+ x y))) ;; z -> 10 (x 7)
(* z x)))
70
gosh> (let ((x 2) (y 3))
(let ((x 7) (z (+ x y))) ;; z -> 5 (x 2)
(* z x)))
35
let, let*, letrecを読んで理解した。
ということは前者のほうも評価の順序を入れ替えてやれば、、、
gosh> (let ((x 2) (y 3))
(let* ((z (+ x y)) (x 7)) ;; ここ変えた
(* z x)))
35
なるほど。
22122007 Gauche
なんとなく掴みかけてきた。
continuation は「continuation が呼ばれると、continuation が作られた call/cc の外に、引数を call/cc の返り値としてジャンプする」というのが正しい振る舞いです。
gosh> (+ 5 (call/cc (lambda (cont) (* 10 10))))
105
gosh> (+ 5 (call/cc (lambda (cont) (cont 10))))
15
gosh> (+ 5 (call/cc (lambda (cont) (cont (+ 1 2 3)))))
11
次にやる処理を包み込んでひっくり返すというイメージよりは、単純にセーブポイントと考えたほうがよいのかな。call/ccの返り値としてジャンプ
gosh> (define cont #f)
cont
gosh> (+ 5 (call/cc (lambda (c) (begin (set! cont c) 10))))
15
gosh> (cont 30)
35
gosh> (cont (+ 1 2 3))
11
さてcall/ccを通って何かが出て行くというイメージだと、二枚がけとかできそうな感じなのでやってみる。
gosh> (+ 10 (call/cc (lambda (d) (begin (set! cont2 d)
(+ 5 (call/cc (lambda (c) (begin (set! cont c) 10))))))))
25
セーブポイントはcont2とcontの二箇所。cont2をよべば(+ 10 cont2の返り値),contを呼べば(+ 10 (+ 5 contの返り値)が評価されるはず。
gosh> (cont 3)
18
gosh> (cont2 3)
13
おーきた。call/ccからジャンプしてきた。なんつーかperlのデバッガで作業してるみたいな感覚だ。
最後の式を評価して返す
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
let1って何だろうって思ったので。
let1 var expr body …
変数が一つしか無い場合の便利なマクロです。次のように展開されます。
(let ((var expr)) body …)
Gaucheのdisplayとprintってperlのprintとsayと似たような関係なんだろうか?と思った。
章ってのは読了になるのだろうか?
それにしてもやっとって感じ。