プログラミングGauche読了

やっと読み終わった。

ProductName プログラミングGauche
Kahuaプロジェクト
オライリージャパン / ¥ 3,360 ()
通常24時間以内に発送

19章の継続のところのcall/cc、コルーチンの話と、26章の自前で簡易HTTPサーバーを作るところが面白かった。

また、(SICPと違って)文字列処理とかモジュールの話などの実用性に重きをおいた部分がよくまとまってperlのように使える気にさせられる。

perlからruby,pythonに移ったって話は聞くけど、perl,ruby,pythonからgaucheに移ったっていうヒトはいるんだろうか?

プログラミング Gauche届いた

めくると興味がこっちに移ってしまいそうだ。

ProductName プログラミングGauche
Kahuaプロジェクト
オライリージャパン / 3360円 ( 2008-03-14 )


というわけで、泣く泣くちょっとの間封印することにした。熟成?

プログラミング Gaucheを予約した

pydevcampの真っ最中ではあったが、amazonで買えるようになったよというエントリを目にして早速注文

ProductName プログラミングGauche
Kahuaプロジェクト
オライリージャパン / 3360円 ( 2008-03-14 )


NodeBoxをSchemeで動かすという野望を耳にした。楽しみー。

というか、mac買わんとあかんなmacbook

letとlet*の違い

分かったような分からんような状態だったが。

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を読んで理解した。

  • let
    • 変数1...変数nのスコープは,let式内部の式1...式mである.
  • let*
    • 変数iのスコープは,すぐあとの代入式(変数(i+1) 初期値(i+1))以降のlet*式の内部全てである.

ということは前者のほうも評価の順序を入れ替えてやれば、、、

gosh>  (let ((x 2) (y 3))
(let* ((z (+ x y)) (x 7)) ;; ここ変えた
(* z x)))
35

なるほど。

継続をつかみかけ

なんとなく掴みかけてきた。

call/cc 入門

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のbeginはperlのdo

最後の式を評価して返す

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

Gaucheのlet1

let1って何だろうって思ったので。

Gauche ユーザリファレンス: 4.6 変数束縛

let1 var expr body …

変数が一つしか無い場合の便利なマクロです。次のように展開されます。

(let ((var expr)) body …)

Gaucheのdisplayとprintって

Gaucheのdisplayとprintってperlのprintとsayと似たような関係なんだろうか?と思った。

SICP一章読了

章ってのは読了になるのだろうか?

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

それにしてもやっとって感じ。