with-output-to-browser — #:g1

Posted 2011-03-01 13:02:00 GMT

with-output-to-stringのようにブラウザで中身を表示させたいな、ということが自分の場合結構あったのでマクロを書いてみました。
htmlで出力させて眺めてみたりと割と応用が効くかもしれません。自分的には便利に使えそうです。

(defmacro with-output-to-browser ((stream &key (browser "firefox")) &body body)
  (let ((filename (format nil "/tmp/~A" (gensym "TEMPFILE-"))))
    `(macrolet ((#0=#:command-output-status (form) `(nth-value 2 ,form)))
       (with-open-file (,stream ,filename :direction :output :if-exists :supersede)
         ,@body)
       (zerop (#0# (kl:command-output "~A ~A" ,browser ,filename))))))
ちなみに、マクロの内容とは関係ないですが#:command-output-statusというコメント的な局所マクロを定義してみています。
自分的に、nth-value 2とかいきなりでてきてもなんのことやら、という感じがするので、こういう風に書いてみたのですが、逆にうるさいかもしれません。
コメントを書くならコードで表現した方が良い、というのは良く聞きますが局所マクロが使える言語では、謎構文にエイリアスを付ける、という表現もありかもしれないなと思ったり。
(aliaslet ((command-output-status ...)) 
  ...)
のようなものを用意しても、もしかしたら便利かも知れません。

comments powered by Disqus