はじめてのGaucheプログラミング

スパムフィルタにbogofilter + KAKASIを使っているのだが、最近誤判定が多くなった。原因はマルチパートのメールなので、適当なMIME展開のフィルタプログラムを書けばいいと思い、Perlのライブラリを調べたけどありすぎてよく分からなかった。そこで、最近Schemeに凝っていることだし、せっかくだからGaucheで書いてみることにした。
(正確に言うと本当に「はじめての」というわけではないんだけど、少なくとも実用的なプログラムはこれが初めて)

#! /usr/bin/env gosh

(use srfi-1)
(use rfc.822)
(use rfc.mime)
(use gauche.charconv)

(define (decode-from-port port)
  (let ((headers (rfc822-header->list port)))
    (mime-parse-message port headers mime-body->string)))

(define (decode-from-file file)
  (call-with-input-file file decode-from-port))

(define (decode-mime-part mime-part)
  (let ((part-type (slot-ref mime-part 'type)))
    (cond ((string=? part-type "multipart")
           (append-map decode-mime-part (slot-ref mime-part 'content)))
          ((string=? part-type "text")
           (let* ((parameters (slot-ref mime-part 'parameters))
                  (charset-pair (assoc "charset" parameters)))
             (if charset-pair
                 (let ((content (slot-ref mime-part 'content)))
                   (list (ces-convert content (cdr charset-pair))))
                 '())))
          (else '()))))

(define (main args)
  (let ((mime-part (decode-from-port (current-input-port))))
    (for-each display (decode-mime-part mime-part))))

ドキュメントを読みながら試行錯誤の末、たったこれだけのプログラムで出来てしまった。やっぱりライブラリの力は偉大だ。