我的问题是,当CL-WHO将Lisp S表达式转换为html输出时,每个表达式都从一个报价市场开始。大多数时候都可以,但是这是一个问题,因为我正在将文件链接到外部javascript文件。我正在尝试简化该项目,并且由于我们团队中的所有JavaScript开发人员都不了解Common Lisp,因此使用parenscript可能不可行。这是我的问题的示例,也是程序中的错误之一:
:onclick "alertUser('id')"
在html文档中按下特定元素时,这将触发一个名为alertUser的JavaScript函数,并且标记的ID应该作为参数传递给JavaScript函数。但是不管我做什么,CL-WHO都会将该字符串转换为单引号,因此我最终得到了一个无效的表达式。该代码将转换为以下内容:
onclick='alertUser('id')'>
所有内容都是单引号,因此'alertUser(')作为第一个字符串显然是无效的,并且我在开发人员工具中收到一个语法区域。我认为我可以通过使用带转义字符的format函数来解决此问题等于:
CL-USER> (format t "\"alertUser('id')\"")
"alertUser('id')"
NIL
CL-USER>
但是当我尝试使用CL-WHO时:
:onclick (format nil "\"alertUser('id')\"")
即表示为:
onclick='"alertUser('locos-tacos-order')"'>
这也是无效的html。如您所见,无论如何,CL-WHO都将以单引号开头。接下来,我尝试了CL-WHO fmt函数:
:onclick (fmt "\"alertUser('locos-tacos-order')\"")
当我使用fmt函数时,当转换为html时,它会完全摆脱我的:onclick表达式!
id='id'"alertUser('id')">
最后我尝试了str函数,并且得到了与原始尝试类似的无效输出:
onclick='"alertUser('id')"'
很明显,如果我用纯HTML编写代码,它将看起来像这样:
onclick="alertUser('id')">
哪个有效。 我的问题很简单,我如何在这种情况下使CL-WHO使用双引号而不是单引号?
答案 0 :(得分:2)
@jkiiski在我的问题下方的评论中给出了正确的答案,但我想发布答案,以便将来遇到类似问题的任何人都可以解决该问题。正如@jkiiski所说,cl-who软件包中有一个名为 ATTRIBUTE-QUOTE-CHAR 的变量,默认为#\'。您可以简单地将该变量设置为#\“,以便将默认引号用作双引号:
(setf *attribute-quote-char* #\")
在文件顶部附近添加该行代码后,我的html默认为:
onclick="alertUser('id')"
,现在javascript可以正确执行了。将正确答案归功于@jkiiski。