1

使用CL-WHO生成 HTML 的常用方法是使用宏with-html-outputwith-html-output-to-string. 这使用特殊的语法。例如:

(let ((id "greeting")
      (message "Hello!"))
  (cl-who:with-html-output-to-string (*standard-output*)
    ((:p :id id) message)))

是否可以将数据写入((:p :id id) message)列表而不是使用上面显示的宏语法?例如,我想将 HTML 定义为这样的列表:

(let* ((id "greeting")
       (message "Hello!")
       (the-html `((:p :id ,id) ,message)))
  ;; What should I do here to generate HTML using CL-WHO?
  )

CL-WHO 可以获取一个普通的 Lisp 列表并从列表中生成 HTML 吗?

4

1 回答 1

0

您想将代码插入到表达式中。

实际上你需要eval:

(let* ((id "greeting")
       (message "Hello!")
       (the-html `((:p :id ,id) ,message)))
  (eval `(cl-who:with-html-output-to-string (*standard-output*)
    ,the-html)))

但这不好用eval。但是宏包含一个implicite eval。我会为此定义一个宏并调用该宏:

(defun html (&body body)
  `(cl-who:with-html-output-to-string (*standard-output*)
    ,@body))

;; but still one doesn't get rid of the `eval` ...
;; one has to call:
(let* ((id "greeting")
       (message "Hello!")
       (the-html `((:p :id ,id) ,message)))
  (eval `(html ,the-html)))
于 2021-11-15T09:06:54.793 回答