脳汁でコードを書く

Archive for 1 月, 2010

第一回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さんにわたします!