See this: <a href="http://common-lisp.net/pipermail/cl-who-devel/2010-February/000421.html">http://common-lisp.net/pipermail/cl-who-devel/2010-February/000421.html</a><br><br><div>Best regards,</div><div>Vsevolod<br><div><br>

<div class="gmail_quote">On Sun, Mar 28, 2010 at 11:10 PM, J. K. Cunningham <span dir="ltr"><<a href="mailto:J.k.cunningham@comcast.net">J.k.cunningham@comcast.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">




  
  

<div>
I've been playing around with a way to partially automate writing outline-based pages and run into something I don't know how to do. I'm hoping someone can perhaps offer a solution or point me in the right direction. I've reduced the scope to a fairly simple situation which might seem unmotivated in this form. But if I can find a way to do this, the rest of what I'm doing will fall into place. <br>


<br>
I'd like to be able to write code that looks like this (example):<br>
<br>
<pre><font color="#003300">(let ((hform "A Title"))</font>
<font color="#003300">  (with-html-output (*standard-output* nil :indent 0)</font>
<font color="#003300">    (section (hform)</font>
<font color="#003300">          (:p "A paragraph can go here. ")</font>
<font color="#003300">          (section ("A Subtitle")</font>
<font color="#003300">            "Subsection text goes here."))</font>
<font color="#003300">    (section ("Second Title")</font>
<font color="#003300">      "Any cl-who syntax input here:"</font>
<font color="#003300">      (:ol (:li "Item 1")</font>
<font color="#003300">           (:li "Item 2")))))</font>

</pre>
where SECTION would be a macro so that it can take CL-WHO syntax arguments. The idea is that the SECTION macro would expand so that I ended up effectively with this:<br>
<br>
<pre><font color="#003300">(let ((form "A Title"))</font>
<font color="#003300">  (with-html-output (*standard-output* nil :indent 0)</font>
<font color="#003300">    (:h1 (str form))</font>
<font color="#003300">    (:p "A paragraph can go here. ")</font>
<font color="#003300">    (:h2 "A Subtitle")</font>
<font color="#003300">    "Subsection text goes here."</font>
<font color="#003300">    (:h1 "Second Title")</font>
<font color="#003300">    "Any cl-who syntax input here:"</font>
<font color="#003300">    (:ol (:li "Item 1")</font>
<font color="#003300">         (:li "Item 2"))))</font>

</pre>
I came up with a helper macro like this to handle the levels as a variable:<br>
<br>
<pre><font color="#000000">(defmacro hn (level &body body)</font>
<font color="#000000">  ``(,(intern (format nil "H~d" ,level) :keyword)</font>
<font color="#000000">       ,,@body))</font>

<font color="#000000">(let ((lvl 2)</font>
<font color="#000000">      (title "A Title"))</font>
<font color="#000000">  (with-html-output (*standard-output*)</font>
<font color="#000000">    (str (hn lvl (:b (str title))))))</font>

;; => <h2><b>A Title</b></h2>

</pre>
This enables me to write code that looks like this:<br>
<br>
<pre><font color="#003300">(defmacro section ((n &rest heading) &body body)</font>
<font color="#003300">  `(str (with-html-output-to-string (s nil :indent 0)</font>
<font color="#003300">          (str (hn ,n ,@heading))</font>
<font color="#003300">          (str (with-html ,@body)))))</font>

<font color="#003300">(let ((lvl 1)</font>
<font color="#003300">      (form "A Title"))</font>
<font color="#003300">  (with-html-output (*standard-output* nil :indent 0)</font>
<font color="#003300">    (section (lvl form)</font>
<font color="#003300">          (:p "A paragraph can go here. ")</font>
<font color="#003300">          (section ((1+ lvl) "A Subtitle")</font>
<font color="#003300">            "Subsection text goes here."))</font>
<font color="#003300">    (section (lvl "Second Title")</font>
<font color="#003300">      "Any cl-who syntax input here:"</font>
<font color="#003300">      (:ol (:li "Item 1")</font>
<font color="#003300">           (:li "Item 2")))))</font>
</pre>
<br>
<font color="#000000">But this leaves me with having to manage the levels manually. What I can't figure out how to do is write the SECTION macro so it doesn't require the LVL arguments, incrementing them recursively. </font><br>


<br>
<font color="#000000">If it could be written as a function, I could use a closure that started at LVL = 1 and incremented at each level, but I'm not good enough with macros to see how to do this. </font>
<pre>I'm probably looking at this the wrong way. Does anyone have any ideas how to go about this?

Regards,
Jeff Cunningham

</pre>
<br>
<br>
<br>
</div>

<br>_______________________________________________<br>
cl-who-devel site list<br>
<a href="mailto:cl-who-devel@common-lisp.net">cl-who-devel@common-lisp.net</a><br>
<a href="http://common-lisp.net/mailman/listinfo/cl-who-devel" target="_blank">http://common-lisp.net/mailman/listinfo/cl-who-devel</a><br></blockquote></div><br><br clear="all"><br>-- <br>vsevolod<br>
</div></div>