如何在 CL-WHO 中为 XML 属性生成双引号而不是单引号

How to produce double quotes instead of single quotes for XML attributes in CL-WHO

默认情况下,CL-WHO 使用单引号来引用 XML 属性值(例如 <h1 id='title'>Hello!</h1>)。我正在尝试将 cl-who:*attribute-quote-char* 设置为 #\",以便属性值使用双引号代替(例如 <h1 id="title">Hello!</h1>)。但是,当我在 ASDF 中使用它时,(setq cl-who:*attribute-quote-char #\") 似乎没有任何效果:

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* #\"))

但是,我不知道这是如何工作的,也不知道为什么会这样。

发生这种情况是因为 with-html-output 足够聪明,可以发现(有些,它不一定能发现所有)生成的 HTML 是常量字符串的情况。在那些情况下,它只是将整个事情变成一个 macroexpansion-time 常量。这发生在您分配给变量之前,这发生在加载时。这就是为什么用 (eval-when (... :compile-toplevel) ...) 包装它的原因。