cl中的格式 - 谁不能正常工作

时间:2010-12-16 12:31:24

标签: lisp format hunchentoot

我正在尝试通过hunchentoot和cl-who建立个人网站,但我在以下代码中出现语义错误:

(defun index ()
  (standart-page (:title "~apb")
                 (dolist (article (articles))
                   (cl-who:htm
                    (:ul
                     (:li (format nil "~a: ~a" (article-date article) (article-title article))))))))

“standart-page”是一个宏:

(defmacro standart-page ((&key title) &body body)   `(cl-who:with-html-output-to-string (*standart-output* nil :prologue t :indent t)
                               (:html :xmlns "http://www.w3.org/1999/xhtml"
                                      :xml\:lang "de"
                                      :lang "de"
                                      (:head
                                       (:title ,title)
                                       (:body
                                        (:div :id "wrapper"
                                              (:div :id "header"
                                                    (:h1 "~apb"))
                                              (:div :id "content"
                                                    ,@body)))))))

评估“(索引)”(“(文章)”中的一篇测试文章返回:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='de' lang='de'>
  <head>
    <title>
      ~apb
    </title>
    <body>
      <div id='wrapper'>
        <div id='header'>
          <h1>
            ~apb
          </h1>
        </div>
        <div id='content'>
          <ul>
            <li>
            </li>
          </ul>
        </div>
      </div>
    </body>
  </head>
</html>

通过查看<li>..</li>标签,我想知道为什么没有输出。我认为格式函数有问题,但我不知道是什么。

3 个答案:

答案 0 :(得分:3)

对于format具体而言,安德鲁的回答是正确的。通常,您可以使用str

CL-USER> (with-html-output-to-string (*standard-output*)
           (:p (str (format nil "~A" '<hello/>))))
"<p><HELLO/></p>"

请注意,在这种情况下,字符串不会被HTML转义(这也适用于fmt)。如果您愿意,请改为使用esc

CL-USER> (with-html-output-to-string (*standard-output*)
           (:p (esc (format nil "~A" '<hello/>))))
"<p>&lt;HELLO/&gt;</p>"

同样,使用htm在退出时退回到HTML模式:

CL-USER> (with-html-output-to-string (*standard-output*)
           (:ul (loop for x from 1 to 3
                      do (htm (:li (str x))))))
"<ul><li>1</li><li>2</li><li>3</li></ul>"

答案 1 :(得分:2)

一个明显的错误就是你拼错了“标准”。因此,将流绑定到*standart-output*(原文如此)不会像您想要的那样重新绑定*standard-output*

答案 2 :(得分:1)

查看CL-WHO网站上的使用示例,我认为您不能只执行返回字符串的格式。他们的所有示例都使用自定义输出函数(例如fmt),这些函数似乎写入了引擎盖下的动态变量。在CL-WHO生成的代码示例中,您将此视为宏扩展中的(format http-output-stream ....)行。

这可以解释为什么你没有得到任何输出,你只需要使用他们的自定义输出编写器而不是你正在使用的(format nil ..)。你可能想要像

这样的东西

(fmt "~a: ~a" (article-date article) (article-title article))