Как создать HTML из списка

Обычный способ создания HTML с помощью CL-WHO - использование макросов with-html-output а также with-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 взять обычный список Лиспа и создать из него HTML?

1 ответ

Вы хотите вставить код в выражение.

На самом деле вам понадобится 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. Я бы определил макрос для этого и вызвал макрос:

      (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)))
Другие вопросы по тегам