<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>LispマクロでLispコードをCSSに変換するようにしてみた へのコメント</title>
	<atom:link href="http://kinokoru.jp/archives/840/feed" rel="self" type="application/rss+xml" />
	<link>http://kinokoru.jp/archives/840</link>
	<description></description>
	<lastBuildDate>Thu, 27 Nov 2014 11:24:26 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.2</generator>
	<item>
		<title>Nisei Kimura より</title>
		<link>http://kinokoru.jp/archives/840#comment-4750</link>
		<dc:creator>Nisei Kimura</dc:creator>
		<pubDate>Wed, 17 Sep 2014 01:08:42 +0000</pubDate>
		<guid isPermaLink="false">http://kinokoru.jp/?p=840#comment-4750</guid>
		<description><![CDATA[深町さん

貴重なフィードバック、ありがとうございます！
物凄く勉強になります。

&gt; with-open-fileも含めて展開するほうがよさそうです。
&gt; マクロ展開時にformatすると、attrs内で変数を使いたいというときに困るかなぁと思ったので、
formatやwrite-stringなどに展開するようにすればもっと表現力が増すかもしれません。
確かにそうですね！
このあたりに関しまして、マクロの鍵である データモードとコードモードの切り替えに対する自分の意識と理解が欠如しておりました…。

&gt; LASS, css-lite に関しまして
シェアしていただきありがとうございます！
深町さんから頂いたコード含め、こちらのコードを拝見しつつ勉強させていただきます。

ありがとうございます！

(追記: ご指摘いただきました通り コメント欄にご記載いただいたソースコードが読みづらくなってしまうため、誠に勝手ながら表示を修正させていただきました。お手数をおかけしてしまい申し訳ございませんでした)]]></description>
		<content:encoded><![CDATA[<p>深町さん</p>
<p>貴重なフィードバック、ありがとうございます！<br />
物凄く勉強になります。</p>
<p>> with-open-fileも含めて展開するほうがよさそうです。<br />
> マクロ展開時にformatすると、attrs内で変数を使いたいというときに困るかなぁと思ったので、<br />
formatやwrite-stringなどに展開するようにすればもっと表現力が増すかもしれません。<br />
確かにそうですね！<br />
このあたりに関しまして、マクロの鍵である データモードとコードモードの切り替えに対する自分の意識と理解が欠如しておりました…。</p>
<p>> LASS, css-lite に関しまして<br />
シェアしていただきありがとうございます！<br />
深町さんから頂いたコード含め、こちらのコードを拝見しつつ勉強させていただきます。</p>
<p>ありがとうございます！</p>
<p>(追記: ご指摘いただきました通り コメント欄にご記載いただいたソースコードが読みづらくなってしまうため、誠に勝手ながら表示を修正させていただきました。お手数をおかけしてしまい申し訳ございませんでした)</p>
]]></content:encoded>
	</item>
	<item>
		<title>深町英太郎 より</title>
		<link>http://kinokoru.jp/archives/840#comment-4735</link>
		<dc:creator>深町英太郎</dc:creator>
		<pubDate>Tue, 16 Sep 2014 22:03:55 +0000</pubDate>
		<guid isPermaLink="false">http://kinokoru.jp/?p=840#comment-4735</guid>
		<description><![CDATA[読みづらいのでgistにあげました。
https://gist.github.com/fukamachi/3e4cf07c5b7331d40b64]]></description>
		<content:encoded><![CDATA[<p>読みづらいのでgistにあげました。<br />
<a href="https://gist.github.com/fukamachi/3e4cf07c5b7331d40b64" rel="nofollow">https://gist.github.com/fukamachi/3e4cf07c5b7331d40b64</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>深町英太郎 より</title>
		<link>http://kinokoru.jp/archives/840#comment-4733</link>
		<dc:creator>深町英太郎</dc:creator>
		<pubDate>Tue, 16 Sep 2014 22:01:17 +0000</pubDate>
		<guid isPermaLink="false">http://kinokoru.jp/?p=840#comment-4733</guid>
		<description><![CDATA[これだとコンパイル時にCSSをファイル出力してしまい、
マクロが意味のないコードに展開されてしまいます。
たとえば、 (defun output-all-css-files () (css ...)) みたいにdefun内で使えなさそう。
with-open-fileも含めて展開するほうがよさそうです。

あと、マクロ展開時にformatすると、attrs内で変数を使いたいというときに困るかなぁと思ったので、
formatやwrite-stringなどに展開するようにすればもっと表現力が増すかもしれません。

簡単に書き直してみました。

[code]
(defmacro css (name elems)
  `(with-open-file
       (*standard-output* ,(string-downcase name) :direction :output :if-exists :supersede)
     ,@(loop for (elem attrs) in elems
             collect
             `(format t &quot;~a {~%&quot; ,elem)
             append
             (mapcar (lambda (attr)
                       (destructuring-bind (name val)
                           attr
                         `(format t &quot;~2T~(~a~): ~a~%&quot; &#039;,name ,val)))
                     attrs)
             collect
             `(format t &quot;}~2%&quot;))
     t))
[/code]

全部format文に展開されます。

[code]
;; (macroexpand-1
;;  &#039;(css
;;    test.css
;;    ((&quot;.hoge&quot;
;;      ((background &quot;#F00&quot;)
;;       (border-radius &quot;5px&quot;)))
;;     (&quot;#fuga&quot;
;;      ((background &quot;#009&quot;)
;;       (color &quot;#FFF&quot;))))))

;; =&gt;

;; (WITH-OPEN-FILE
;;     (*STANDARD-OUTPUT* &quot;test.css&quot; :DIRECTION :OUTPUT :IF-EXISTS :SUPERSEDE)
;;   (FORMAT T &quot;~a {~%&quot; &quot;.hoge&quot;)
;;   (FORMAT T &quot;~2T~(~a~): ~a~%&quot; &#039;BACKGROUND &quot;#F00&quot;)
;;   (FORMAT T &quot;~2T~(~a~): ~a~%&quot; &#039;BORDER-RADIUS &quot;5px&quot;)
;;   (FORMAT T &quot;}~2%&quot;)
;;   (FORMAT T &quot;~a {~%&quot; &quot;#fuga&quot;)
;;   (FORMAT T &quot;~2T~(~a~): ~a~%&quot; &#039;BACKGROUND &quot;#009&quot;)
;;   (FORMAT T &quot;~2T~(~a~): ~a~%&quot; &#039;COLOR &quot;#FFF&quot;)
;;   (FORMAT T &quot;}~2%&quot;)
;;   T)
[/code]

あと、CSSに出力する似たプロジェクトとして、
つい最近@ShinmeraがLASS (https://github.com/Shinmera/LASS) を公開しています。
LASSはCSSというよりもLESSっぽいものを目指しているようで、CSSを拡張した機能を提供しています。

単純にCSSのS式記法としてはcss-liteがあります。
https://github.com/paddymul/css-lite]]></description>
		<content:encoded><![CDATA[<p>これだとコンパイル時にCSSをファイル出力してしまい、<br />
マクロが意味のないコードに展開されてしまいます。<br />
たとえば、 (defun output-all-css-files () (css &#8230;)) みたいにdefun内で使えなさそう。<br />
with-open-fileも含めて展開するほうがよさそうです。</p>
<p>あと、マクロ展開時にformatすると、attrs内で変数を使いたいというときに困るかなぁと思ったので、<br />
formatやwrite-stringなどに展開するようにすればもっと表現力が増すかもしれません。</p>
<p>簡単に書き直してみました。</p>
<pre class="brush: plain; title: ; notranslate">
(defmacro css (name elems)
  `(with-open-file
       (*standard-output* ,(string-downcase name) :direction :output :if-exists :supersede)
     ,@(loop for (elem attrs) in elems
             collect
             `(format t &quot;~a {~%&quot; ,elem)
             append
             (mapcar (lambda (attr)
                       (destructuring-bind (name val)
                           attr
                         `(format t &quot;~2T~(~a~): ~a~%&quot; ',name ,val)))
                     attrs)
             collect
             `(format t &quot;}~2%&quot;))
     t))
</pre>
<p>全部format文に展開されます。</p>
<pre class="brush: plain; title: ; notranslate">
;; (macroexpand-1
;;  '(css
;;    test.css
;;    ((&quot;.hoge&quot;
;;      ((background &quot;#F00&quot;)
;;       (border-radius &quot;5px&quot;)))
;;     (&quot;#fuga&quot;
;;      ((background &quot;#009&quot;)
;;       (color &quot;#FFF&quot;))))))

;; =&gt;

;; (WITH-OPEN-FILE
;;     (*STANDARD-OUTPUT* &quot;test.css&quot; :DIRECTION :OUTPUT :IF-EXISTS :SUPERSEDE)
;;   (FORMAT T &quot;~a {~%&quot; &quot;.hoge&quot;)
;;   (FORMAT T &quot;~2T~(~a~): ~a~%&quot; 'BACKGROUND &quot;#F00&quot;)
;;   (FORMAT T &quot;~2T~(~a~): ~a~%&quot; 'BORDER-RADIUS &quot;5px&quot;)
;;   (FORMAT T &quot;}~2%&quot;)
;;   (FORMAT T &quot;~a {~%&quot; &quot;#fuga&quot;)
;;   (FORMAT T &quot;~2T~(~a~): ~a~%&quot; 'BACKGROUND &quot;#009&quot;)
;;   (FORMAT T &quot;~2T~(~a~): ~a~%&quot; 'COLOR &quot;#FFF&quot;)
;;   (FORMAT T &quot;}~2%&quot;)
;;   T)
</pre>
<p>あと、CSSに出力する似たプロジェクトとして、<br />
つい最近@ShinmeraがLASS (<a href="https://github.com/Shinmera/LASS" rel="nofollow">https://github.com/Shinmera/LASS</a>) を公開しています。<br />
LASSはCSSというよりもLESSっぽいものを目指しているようで、CSSを拡張した機能を提供しています。</p>
<p>単純にCSSのS式記法としてはcss-liteがあります。<br />
<a href="https://github.com/paddymul/css-lite" rel="nofollow">https://github.com/paddymul/css-lite</a></p>
]]></content:encoded>
	</item>
</channel>
</rss>
