いろいろ実装を変えてみました!
もっと Scheme っぽくなるようにいろいろ試してみました(・-・*)
フィルタリストと fold での関数適用
main 関数が肥大化してて、set! もたくさんつかっていたので、関数に分離していきました( ̄m ̄*)V できるだけ汎用的になるように工夫 (っていえるのかな (笑))
; 適用フィルタの定義 (define *filters* (list sort-entries filter-by-path-info paging ))
と
; フィルタを順に適用する (define files (fold (lambda args (apply (car args) params (cdr args))) (list-files) *filters*))
のようにして、簡単にフィルタを追加できるようにしてみました! 順に適用するのはもっと簡単に書けそうだけどよくわかりません(ρ_;)
それにしてもこういうフィルタのチェインを見ると Plagger と思っちゃう (笑)
ページング機能
これもフィルタとして実装してみました
; ページングフィルタ ; template-hash-table に値を追加する (define (paging params files) (let ([page-slices (slices files *entry-number*)] [page-current (cgi-get-parameter "page" params :default 0 :convert (lambda (param) (- (string->number param) 1)))]) (hash-table-put! template-hash-table 'page-slices page-slices) (hash-table-put! template-hash-table 'page-current page-current) (list-ref page-slices page-current) ))
result 関数には template-hash-table をわたすようになっていて、これはグローバル変数にしています。
テンプレートには
(html:div :class "paging" (let ([num 0] [current (+ (stash-raw 'page-current) 1)]) (map (lambda (page) (inc! num) (if (= num current) (html:span :class "current" num " ") (html:span (html:a :href #`"?page=,num" num) " " )) ) (stash-raw 'page-slices))) )
などとだいぶ適当にページャをつけています。年表示とかでもページングがきいていいかな (笑) slices 関数がすごく便利(=´∇`=)
練習に Blosxom クローンを作ってみました☆
今日は早く帰ってこれた (笑) ちなみに、わたしは部活に入ってなかったりします☆ コンピュータ部っていうのはあるんですけど、プログラムを書く人っていうのはいないんです(ρ_;)
なので今日は Scheme の練習のために Blosxom みたいなのを作ってみました(・-・*) むずかしいっ!
- http://jknaoya.s311.xrea.com/bloscheme/bloscheme.scm
- http://jknaoya.s311.xrea.com/bloscheme/template.scm
- 動いてるページ http://jknaoya.s311.xrea.com/bloscheme/bloscheme.cgi/
template.scm はかんたんにトップレベルに result っていう関数を定義しているだけです。どうやるのがスキームうぇいなのかなぁ( ̄〜 ̄;)??
そもそも XREA に Gauche を入れるのがたいへんだった(ノ_<。) http://d.hatena.ne.jp/scinfaxi/20070518/1179468568 を見ながらやったみたけど、ローカルの libgauche と競合してうまく make install できなかった (。>_<。) 最後は 0.8.6 を XREA で make install までやったらできた ( ̄ー ̄)v
あとそういえば学校では Hello, World! をやりました (笑)
#!/usr/bin/env gosh (define (main args) (let ([append-str (cdr args)]) #?=args ; ./test.scm test -> ("./test.scm" "test") (if (null? append-str) (set! append-str *program-name*) (set! append-str (string-join (cdr args)))) (format (current-output-port) "Hello, World. ~a\n" append-str)) 0)
すこしわたしなりに書きくわえてみたりしてました。ただ表示するだけじゃつまんないし (笑)