proglog

主にプログラミングに関する断片的メモ

文字でマッチさせるcase文とシンボル

ちょっとはまったのでメモ。
schemecase文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-"は複数の引き数を摂る形で定義。
  • シンボルじゃなく、手続きをリストの中に入れるために、準クォートを使う。


探せばマクロがありそう。