いろいろ実装を変えてみました!

もっと 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 関数がすごく便利(=´∇`=)