相変わらず継続

継続のあたりをうろうろしてますが、先週末に到着したOn Lispの継続の章をつまみ読みしてまたちょっと理解がすすんだような気がしたようなしないような。

ProductName On Lisp
ポール グレアム
オーム社 / 3990円 ( 2007-03 )


最後の方で、

継続

CPS変換を覚えればcall/ccを書くのは簡単だ. CPS変換を経たプログラムでは,全体に対する現在の継続が常に存在し, call/ccはその引数として何らかの関数を呼び出す単純なマクロとして実装できる.

と書いてあるのだが、perl - to goto or not to goto, that's the continuationの先にどうやればperlでcall/ccが実装できるのかわからん。

rubyにはcall/ccがあるらしいですね

そもそもCall/CCがrubyに実装されている理由はただ一つで、「実装できてしまったから」である。

GimpのScript-Fu

Script-Fuコンソールを起動するとScheme処理系が立ち上がる

tinyscheme

なにか書いてみたくなりますな。

プログラミングGauche読了

やっと読み終わった。

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

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

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

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

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 …)

Scheme入門読んだ

1章から12章まで割と一気目で。

以下覚書

シンボルの大文字と小文字

Gauche ユーザリファレンス: 2.4 大文字小文字の区別

Lisp系の言語は歴史的にシンボルの大文字小文字を区別していませんでした。 Schemeもその流れを汲んでおり、R5RSでもシンボルは読み込まれる時に大文字小文字の区別をしないと定義されています。(但し、R5RSの範囲内でも処理系内部では大文字小文字を区別することになってます。ここで問題としているのは読み込み時の動作です。)

しかし現在では、プログラミングが一つの言語で完結することは滅多にありません。他の言語とインタフェースを取る場合、Scheme側でも大文字小文字を区別するようにしておいた方が便利です。

gosh -fcase-fold

で大文字小文字を区別しないモード

cdrの読み

クダー

カー、シーディーアールって読んでた。

let系の違い

Scheme入門 第12章 局所変数レット

局所変数(ローカル変数)を定義する let, let*, letrec という構文もあります

letrecをいまいち理解しないでSICP読んでた。

日本語

コンパイル済Windows用バイナリだと日本語が化けたがどうすればいいのかちょっと見つからなかった。

gosh> (gauche-character-encoding)
utf-8

内部文字エンコーディングはUTF-8

クックブック

Gaucheクックブックを一日ひとつ見ていけば3ヶ月以上楽しめてナイス。

手続きの再帰とプロセスの再帰

SICPのp.19に再帰的プロセスと再帰的手続きを混同しないようにとかいてあるのだけれど、

perl - to goto or not to goto, that's the continuation

と、そこから張られた一連のリンクを読んでいてなんとなく掴みかけてきた感じがした。

あとはコメントの、continuationってgotoの意味論研究の過程で生み出された抽象概念ですよ。っていうあたりとか。

なんでも再帰も僕の理解にお役立ち。

なんでも再帰

末尾再帰がループと同等に実行されるのは、コンパイラによるオプショナルな最適化ではない。 Schemeは、末尾呼び出しでスタックを消費しないことを言語規格上要求している。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン
ピアソンエデュケーション / 4830円 ( 2000-02 )


SICPおもろい。