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

なにか書いてみたくなりますな。
プログラミングGauche読了
やっと読み終わった。
19章の継続のところのcall/cc、コルーチンの話と、26章の自前で簡易HTTPサーバーを作るところが面白かった。
また、(SICPと違って)文字列処理とかモジュールの話などの実用性に重きをおいた部分がよくまとまってperlのように使える気にさせられる。
perlからruby,pythonに移ったって話は聞くけど、perl,ruby,pythonからgaucheに移ったっていうヒトはいるんだろうか?
pythonのスコープではまる
ちょっとはまった。結局オブジェクト作って解決しといたけど気持ち悪いので少し調べた。(でも未解決)
クロージャでカウンタを考える。Open Source WEBを参考に
perlだと
sub make_counter {
my $c = $_[0] || 0;
return sub { $c++ }
}
gaucheだとこんな感じ
(define (make-counter n)
(let1 c n
(lambda () (inc! c))))
でもpythonだとだめなの
def make_counter(n):
c = n
def counter():
c = c + 1
return c
return counter
スコープの洗礼をうけた。参照できても代入できないのでglobalにする必要が。
def make_counter(n):
c = n
def counter():
global c
c += 1
return c
return counter
ctr = make_counter(5)
ctr()
ctr()
Traceback (most recent call last):
File "C:\home\kzfm\test.py", line 10, in <module>
ctr()
File "C:\home\kzfm\test.py", line 5, in counter
c += 1
NameError: global name 'c' is not defined
とかいってglobalでも駄目だ。
Gaucheのbeginはperlのdo
最後の式を評価して返す
Gaucheの引数
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
Gaucheのlet1
let1って何だろうって思ったので。
let1 var expr body …
変数が一つしか無い場合の便利なマクロです。次のように展開されます。
(let ((var expr)) body …)
Scheme入門読んだ
1章から12章まで割と一気目で。
以下覚書
シンボルの大文字と小文字
Gauche ユーザリファレンス: 2.4 大文字小文字の区別
Lisp系の言語は歴史的にシンボルの大文字小文字を区別していませんでした。 Schemeもその流れを汲んでおり、R5RSでもシンボルは読み込まれる時に大文字小文字の区別をしないと定義されています。(但し、R5RSの範囲内でも処理系内部では大文字小文字を区別することになってます。ここで問題としているのは読み込み時の動作です。)
しかし現在では、プログラミングが一つの言語で完結することは滅多にありません。他の言語とインタフェースを取る場合、Scheme側でも大文字小文字を区別するようにしておいた方が便利です。
gosh -fcase-fold
で大文字小文字を区別しないモード
cdrの読み
クダー
カー、シーディーアールって読んでた。
let系の違い
局所変数(ローカル変数)を定義する let, let*, letrec という構文もあります
letrecをいまいち理解しないでSICP読んでた。
日本語
コンパイル済Windows用バイナリだと日本語が化けたがどうすればいいのかちょっと見つからなかった。
gosh> (gauche-character-encoding)
utf-8
内部文字エンコーディングはUTF-8
クックブック
Gaucheクックブックを一日ひとつ見ていけば3ヶ月以上楽しめてナイス。
相変わらず継続
継続のあたりをうろうろしてますが、先週末に到着したOn Lispの継続の章をつまみ読みしてまたちょっと理解がすすんだような気がしたようなしないような。
最後の方で、
CPS変換を覚えればcall/ccを書くのは簡単だ. CPS変換を経たプログラムでは,全体に対する現在の継続が常に存在し, call/ccはその引数として何らかの関数を呼び出す単純なマクロとして実装できる.
と書いてあるのだが、perl - to goto or not to goto, that's the continuationの先にどうやればperlでcall/ccが実装できるのかわからん。
そもそもCall/CCがrubyに実装されている理由はただ一つで、「実装できてしまったから」である。



プログラミングGauche
On Lisp―Advanced Techniques for Common Lisp