文字でマッチさせるcase文とシンボル
ちょっとはまったのでメモ。
schemeのcase文はeqv?でマッチさせるので数値とかシンボルとかで使うようだ。
しかし、マッチ先に空白を含むシンボルを置きたい時に、なんだかうまくいかない。
string->symbolでその場で変換、というわけにはいかない感じ。
で、(文字列 手続き)の連想配列を作って、同じようなことをしてみる。
(define (proc-title . data) (list "title" (list-ref data 1))) (define (proc-metadata data) (let ((key (string-upcase (list-ref data 0))) (case-alist `(("TITLE" ,proc-title) ("STATUS" ,proc-status) ("TAGS" ,proc-tags) ("ALLOW COMMENTS" ,proc-allow-comment) ("ALLOW PINGS" ,proc-allow-ping)))) (let1 exp (assoc key case-alist) (cond (exp (apply (list-ref exp 1) data)) (else '(dummy dummy))))))
ここでは"data"はリスト。
- applyがリストをバラして渡すので、各"proc-"は複数の引き数を摂る形で定義。
- シンボルじゃなく、手続きをリストの中に入れるために、準クォートを使う。
探せばマクロがありそう。