Как создавать двойные кавычки вместо одинарных для атрибутов XML в CL-WHO

По умолчанию CL-WHO использует одинарные кавычки для заключения в кавычки значений атрибутов XML (например, <h1 id='title'>Hello!</h1>). я пытаюсь установить cl-who:*attribute-quote-char*к #\"чтобы вместо значений атрибутов использовались двойные кавычки (например, <h1 id="title">Hello!</h1>). Однако, похоже, это не имеет никакого эффекта, когда я использую его в ASDF следующим образом:

myprog.asd:

      (defpackage myprog-asd
  (:use :cl :asdf))
(in-package :myprog-asd)

(defsystem "myprog"
  :depends-on (:cl-who)
  :components ((:file "mypackage")))

mypackage.lisp:

      (defpackage :mypackage
  (:use :cl)
  (:export :f))
(in-package :mypackage)

(setq cl-who:*attribute-quote-char* #\")  ;; <- HERE.

(defun f ()
  (cl-who:with-html-output (*standard-output*)
    (:h1 :id "title" "Hello!")))

Я получаю одинарные кавычки вместо двойных кавычек:

      $ sbcl
* (require "asdf")
* (asdf:load-asd (merge-pathnames "myprog.asd" (uiop:getcwd)))
* (asdf:load-system :myprog)
* (mypackage:f)
<h1 id='title'>Hello!</h1>

Почему (setq cl-who:*attribute-quote-char #\")не имеет никакого эффекта? Как заставить CL-WHO печатать двойные кавычки вместо одинарных?

(версия SBCL: 2.2.2, версия CL-WHO: 1.1.4 [коммит: 0d382647])


Кстати, я обнаружил, что могу получить двойные кавычки, заключив setqв eval-when:

      (eval-when (:compile-toplevel :execute)
  (setq cl-who:*attribute-quote-char* #\"))

Однако я понятия не имею, как и почему это работает.

1 ответ

Это происходит потому, чтодостаточно умен, чтобы обнаруживать (некоторые, но не все) случаи, когда сгенерированный HTML представляет собой константную строку. В этих случаях он просто превращает все это в постоянную времени макрорасширения. и это происходит до того, как вы присвоите значение переменной, что происходит во время загрузки. Вот почему обернув егоработает.

Другие вопросы по тегам