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

もっと 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 みたいなのを作ってみました(・-・*) むずかしいっ!

template.scm はかんたんにトップレベルに result っていう関数を定義しているだけです。どうやるのがスキームうぇいなのかなぁ( ̄〜 ̄;)??

そもそも XREAGauche を入れるのがたいへんだった(ノ_<。) 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)

すこしわたしなりに書きくわえてみたりしてました。ただ表示するだけじゃつまんないし (笑)