Gaucheクックブック

Gauche (ゴーシュ)クックブックは動作する短いコードを一問一答形式で提示していくスタイルのプログラム解説ページです。毎週月曜、木曜に更新。

2007-09-24

HTTPヘッダフィールド名をきれいに整形する

問題

HTTPヘッダーフィールド名はたいてい単語の先頭1文字が大文字になっているが、なかにはWWW-Authenticateのような例外も存在する。RFCに載っている名前に整形したい。

答え

例外だけは特別に扱い、それ以外のフィールド名はstring-titlecaseで整形します。

(use srfi-13)  ; string-titlecase string-downcase

(define (header-titlecase name)
  (cond ((assoc (string-downcase name)
                '(("etag" . "ETag")
                  ("content-md5" . "Content-MD5")
                  ("te" . "TE")
                  ("www-authenticate" . "WWW-Authenticate")))
         => cdr)
        (else (string-titlecase name))))
  
(header-titlecase "etag")          ; => "ETag"
(header-titlecase "user-agent")    ; => "User-Agent"

condのテスト部でassocを使って連想リストを探索し、cdrにそのまま"=>"記号を使って渡すというのは、頻出するイディオムです。assocは探索に成功するとペアを返すので、値だけを取り出すにはそこからさらにcdrを適用しなければならないのですが、これがうまくcondの"=>"を使ったフォームと連係できるのです。