第一回schemeコードバトン(garaemon fitst time編)
1 月 11th, 2010
higeponさんの呼びかけで, 次のshibuya.lispにむけてschemeのコードバトンをやろうということになりました.
higeponさん->yadokarielectriさん->garaemonとバトンがまわってきたので, 少しいじってみました.
修論がやばいのですが, higeponさん曰く「修論よりも大事なものがある」らしいのでやってみる.
僕のコードはここから見れます.
yadokarielectriさんはgauche用に書いてましたが, 良い機会なのでmoshに触れることを個人的な目的に.
moshのbuildはsnow leopardでやりかたがよくからんかった(GMPまわり)ので, linux(ubuntu 9.10)でやりました.
moshはここからおとせます.
ubuntuではgmp3とか入れれば, 普通に./configure, make, make installができますね.
で, 変更箇所はsrfi 37を使って, オプションを渡せるようにしてみました.
srfi 37は自由度が高いですが, まぁ使いにくいので, ちょっとだけ使いやすくしてあげる(自由度は下がるけど).
(define-syntax with-parsed-options (syntax-rules () ((_ (params ...) options arg bodies ...) (receive (params ...) (parse-args arg options) bodies ...))))
みたいなマクロを作ってあげる. lispらしい抽象化ですね. こういう構文は大好きです.でも方向性はCommon Lispっぽいかも. schemeだとcall-with-xxxとしそうだなぁ.
optionsはconfiguration listでこんなかんじ.
(define *arg-options* '(((#\d "debug") ;match string or character #f ;default value #f) ;take value or not ((#\v "verbose") #f #f) ((#\f "dict-file") "words.txt" #t) ((#\h "help") #f #f)))
まぁ詳しいとこはコードを見てください.
使いかたは
% mosh scheme_baton.scm -h % mosh scheme_baton.scm -f=words.txt
みたいな感じに変更されてます.
schemeはGaucheをさわってたことがあるけど, 結構Gaucheの独自拡張を便利に使ってたので, R6RS内で書くのは結構勝手がちがうなー, という感想.
もっとなおした方が良いところもあると思いますが, まぁこれくらいで勘弁ください.
しかし, メインループを再帰で書くのはちょっと抵抗があるなぁw
せっかくなのでcall/ccは残しました
次はyshigeruさんにわたします!



