Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2011-03-01

with-output-to-browser

| 22:02 | with-output-to-browser - わだばLisperになる を含むブックマーク はてなブックマーク - with-output-to-browser - わだばLisperになる

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 ...)) 
  ...)

のようなものを用意しても、もしかしたら便利かも知れません。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20110301