5.9 KiB
5.9 KiB
title | author | date | url | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|---|
マクロを使って HTTP 接続を行う構文を作ってみた | kazu634 | 2011-05-30 | /2011/05/30/_1703/ |
|
|
マクロを使って 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")))