SchemeコードバトンをGaucheでCGIにしてみた
Scheme コードバトンまとめページ - ひげぽん OSとか作っちゃうかMona-
より、英単語暗記補助ツールを作るお題。
最初はコマンドプロンプトで「この単語を知っているか? Y/N/Q」だけの単純なプログラム(67行)だったのが、
10人以上のバトンを経て、今はすごい複雑(570行)になってる。
とてもついていけないので、こうなったらもう、違う方向から攻めようということで、GaucheでCGIにしてみた。
http://eva-lu-ator.net/~gemma/baton/
↑のは、実はAjaxで以下の4つ5つのWeb APIを叩いてる。
word.cgi?q=3
q は問題ID(整数)。
問題データを返す。
<quiz id="3"> <word>defect</word> <mean>欠点</mean> <ok>4</ok> <ng>5</ng> </quiz>
q は問題ID(整数)。aはユーザの答(1文字 y Y n N)。
サーバにある、その問題の正答率の記録を更新する。
更新成功なら以下のデータを返す。
<success/>
正答率下位r個のランキングを返す。
<ranking r="5"> <quiz id="2"> <word>errand</word> <mean>使いっ走り</mean> <ok>5</ok> <ng>7</ng> </quiz> <quiz id="3"> <word>defect</word> <mean>欠点</mean> <ok>4</ok> <ng>5</ng> </quiz> ...以下同様... </ranking>
w は英単語(数字とアルファベットからなる3文字以上の文字列)。mはその英単語の意味(16文字未満の文字列)。
サーバに、新しい英単語を追加する。
追加成功なら以下のデータを返す。
<success/>
word.cgi
おすすめの出題順をカンマ区切りで返す。lenは全問題数。
<order len="5">2,3,4,1,0</order>
工夫したところ
辞書データの形式をS式にした
元々の辞書データの形式は以下だった。
("heap" "積み重ねた物") ("exploration" "探査、探検") ("errand" "使いっ走り") ("defect" "欠点") ("allowance" "割当量")
データは行でなくカッコで区切るべし。以下のように変更した。
(("heap" "積み重ねた物") ("exploration" "探査、探検") ("errand" "使いっ走り") ("defect" "欠点") ("allowance" "割当量"))
S式にしたおかげで、read/write一発で辞書データを読み書きできるようになった。
Future Work
- ワーストk個を求めるために、リストをソートして先頭k個を取り出すという効率の悪いアルゴリズムを使っているので直してほしい。
- Webデザインをよろしく頼む。
- 辞書データが少なすぎる。
- Mosh、Common Lisp、Clojure バージョンもぜひ。