我正在尝试通过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>
标签,我想知道为什么没有输出。我认为格式函数有问题,但我不知道是什么。
答案 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><HELLO/></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))