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



默认情况下,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是常量字符串的情况。在这些情况下,它只是把整个事情变成了一个宏观膨胀时间常数。这发生在您分配给变量之前,这发生在加载时。这就是为什么用(eval-when (... :compile-toplevel) ...)包装它是有效的。

最新更新