マクロを使って HTTP 接続を行う構文を作ってみた

May 30, 2011   #gauche  #Lisp  :

マクロを使って HTTP 接続を行う構文を作ってみようと決意したのですが、うまくできず。。。なぜだろう???

やってみたいこと

こういうパターンが良く出てきました:

(receive (status header body)
(http-get ...)
(cond
[(equal? "200" status) (proc body)] ;; ここの手続きは指定したいなぁ
[(equal? "400" status) (print "Authentication failure.")]
[else (print status header body)]))

こういうパターンをこんなように書けたらいいかなぁと思いました:

(wrap-http (http-get ...) proc '(("400" . "Authentication failure.")))

とりあえず書いてみた

こんなのを書いてみました:

(define-macro (wrap-http http-method proc status-msg)
(let* ((success `((equal? "200" status) (,proc body)))
(else-msg `(else (print status header body))))
`(receive (status header body)
,http-method
(cond
,success
,@(map (lambda (s)
`((equal? ,(car s)) (print ,(cdr s))))
status-msg)
,else-msg))))

でもこれを使おうとすると、「*** ERROR: Compile Error: pair required, but got quote」となってしまいました。。。なぜなのでしょう。。。

ちなみに

これは無事に実行出来るようなんだよなぁ:

gosh> (map (lambda (i)
`((equal? ,(car i)) (print ,(cdr i))))
'(("404" . "Not found")))
(((equal? "404") (print "Not found")))