1

假设我为 CL-WHO 定义了一个宏:

(defmacro test-html (&body body)
   `(with-html-output-to-string (*standard-output* nil :PROLOGUE t :indent t)
      (:html
       (:body
    ,@body))))

然后:

(test-html (:h1 "hallo"))

给出(删除第一行):

"<html>
  <body>
    <h1>
      hallo
    </h1>
  </body>
</html>"

正如预期的那样。现在我定义了一个函数来生成 CL-WHO 使用的 s 表达式:

(defun test-header (txt)
  `(:h1 ,txt))

当用“hallo”调用时返回

(:h1 "hallo")

但是现在当我打电话时

(test-html (test-header "hallo"))

它返回:

"<html>
  <body>

  </body>
</html>"

出了什么问题,为什么?

4

2 回答 2

1

我有同样的问题。据我所知,在 cl-who 的正式版本中是不可能的:http: //lisp-univ-etc.blogspot.com/2009/03/cl-who-macros.html

我改用这个版本,它支持宏:https ://github.com/vseloved/cl-who

于 2012-04-12T13:25:52.817 回答
1

我倾向于解决这个问题的方法是定义一个快捷宏,比如

(defmacro html-to-stout (&body body)
  "Outputs HTML to standard out."
  `(with-html-output (*standard-output* nil :indent t) ,@body))

或字符串等效项。这里的关键是它不输出 a :prologue,因此它可以输出一个 HTML 块而不是整个页面。一旦你有了它,你就可以做类似的事情

(defun test-header (text)
  (html-to-stout 
    (:h1 (str text))))

(test-html (test-header "Hello Hello"))
于 2012-04-12T19:11:16.247 回答