第1回 Scheme コードバトン (CL fork)に参加しました。
Scheme のコードをバトンのように回していき面白い物ができあがるのを楽しむ遊びを始めました。
第1回 Scheme コードバトンのお知らせ – ひげぽん OSとか作っちゃうかMona-
Common Lispへのフォークは、id:g000001 さん。
id:cranebirdさんからバトンを頂きました。
追記: NANRIさんにバトンを引き継いて頂けました。ありがとうございます。
追加した機能
- 単語のスコアを表示するようにした。
- 単語の一覧表示で指定したスコア以下の単語のみを表示する機能を追加した。
Common Lispの特徴を活かした興味深い修正とは行きませんので、UI的な部分での修正を行ないました。以下でそれぞれの修正についてメモしておきます。
単語のスコアを表示するようにした
元々、単語の並べ順は、(NGカウント) – (OKカウント) でソートしていましたが、これでは、間違った単語を重点的に復習する重みずけにならないので、変更したいなと思ったのが、修正の動機です。単語の定義ファイルには、単語と意味とOKのカウントとNGのカウントしか残されていないので、とりあえず、そこからスコアらしきものをでっちあげてみました。
(defun entry-score (entry) "Return a score of this entry." (- (entry-ok-count entry) (* (entry-ng-count entry) 3)))
今は、上のようにNGのカウントに3倍の重みをつけて減点する形でスコアを求めています。とは言え、もっと賢いスコアの求め方がありそうなので、バトンを受けとった方々、どしどし修正してください。
スコアを計算するようにしたので、問題の単語表示時にもスコアを表示するようにしました。実行したところは、以下のような感じでスコアが表示されます。前のような表示に慣れてるとうざいかもしれないですが、スコアが表示されることで、「この単語をいつも間違えるんだな」とか意識して使えるようになると思います。
[1]> (require "scheme_baton.lisp") ;; Loading file scheme_baton.lisp ... ;; Loaded file scheme_baton.lisp T [2]> (hige:pon) ;; setup dict...done river (score: 4): 川 [Ynq]: cold (score: 6): 冷たい [Ynq]: hot (score: 8): 熱い [Ynq]: eat (score: 10): 食べる [Ynq]:
あと、デフォルトの出題順序決定関数 sort-dict-standard でもスコアを利用してソートするようにしました。
単語の一覧表示で指定したスコア以下の単語のみを表示する機能を追加した。
スコアがらみで、単語の一覧表示コマンド(pun)にキーワード引数を追加して、苦手単語だけを表示することができるようにしました。
今まで、punは、dump-dictのエイリアスだったのですが、辞書の初期化(setup-dict)が行なわれる前に、punが呼び出されるとエラーになるという問題があったので、dump-dictは内部で利用するもの、punは外部とのUIという観点で、punをエラーチェックも行なう別関数として実装しました。
下は、スコアが5以下の単語のみを表示した様子。
[5]> (hige:pun :score-threshold 5) star,星,3,0 river,川,5,0 NIL [6]>
嵌ったこと
- マクロにキーワード引数を渡そうとして、エラーが出た。ちゃんとマクロの評価タイミングを理解してない。
- setup-dict内で、出題順序のソートを行なっているが、with-entryの引数でソートの順序指定関数とフィルター関数を渡せるようにしようかと思ったが、上のマクロの問題で嵌って諦めました。
まとめ
思い切ってバトンを受けちゃいましたが、バトンという形式は、駅伝じゃないですが、自分が繋がないとっていう緊張感がありますね。修正した後、本家schemeのコードバトンの行方(http://gist.github.com/279595)も眺めてみたんですが、シェルスクリプトから実行する形式のscheme版は、UI的に大胆な変更が加えられているのに対し、Common Lisp版は、「Lisperは臆病」 を地で行くように、今までの動作との互換性を保ちながら、ライブラリとしての変更が加えられていると感じました。後になってですが、バトンを複数ファイルにすることはできるんだろうか?ライブラリ的な方向に進んでるので、今のhigeパッケージを利用した、色々なUIとかを追加するには、複数ファイルで構成できた方が自由ですね。あとScheme版にあってCommon Lisp版に無い物…テスト。
先人達のコードを読んで勉強になったし、予想以上に楽しかったです。
まとめていますが、次の方にバトンを渡すまで油断できない。。。
次にバトンを受けてくれる方、絶賛募集中です。
追記: NANRIさんにバトンを引き継いて頂きました。
履歴
- http://d.hatena.ne.jp/higepon/20100110/1263121990
- http://cadr.g.hatena.ne.jp/g000001/20100111/1263204766
- http://aka-cs-blog.blogspot.com/2010/01/scheme.html
- http://read-eval-print.blogspot.com/2010/01/1-scheme.html
- http://twitter.com/snmsts
- http://twitter.com/bizenn
- http://blog.livedoor.jp/naoya_t/archives/51321875.html
- http://d.hatena.ne.jp/masatoi/20100117/1263674020
- http://d.hatena.ne.jp/cranebird/20100117/1263711619
- http://d.hatena.ne.jp/smeghead/20100118/codebaton (ここ)