いろいろ実装を変えてみました!
もっと 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 関数がすごく便利(=´∇`=)