默认情况下,CL使用单引号引用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-谁打印双引号而不是单引号?
(SBCL版本: 2.2.2,CL-WHO版本: 1.1.4提交:0d 382647)
顺便说一句,我发现我可以通过将setq包装在eval-when中得到双引号。
(eval-when (:compile-toplevel :execute)
(setq cl-who:*attribute-quote-char* #\"))然而,我不知道这是如何运作的,也不知道为什么。
发布于 2022-04-15 18:26:22
之所以会发生这种情况,是因为with-html-output足够聪明,能够发现(某些情况下,它不一定能发现所有的情况),生成的HTML是一个常量字符串。在这种情况下,它只是把整个事情变成了一个宏观扩张时间常数。在分配给变量之前,就会发生这种情况,这种情况发生在加载时。这就是为什么用(eval-when (... :compile-toplevel) ...)包装它的原因。
https://stackoverflow.com/questions/71868774
复制相似问题