--- title: マクロを使って HTTP 接続を行う構文を作ってみた author: kazu634 date: 2011-05-30 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:5431;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - 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")))