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