CL-WHO始终以单引号开头

时间:2019-04-24 03:27:38

标签: javascript lisp common-lisp hunchentoot cl-who

我的问题是,当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使用双引号而不是单引号?

1 个答案:

答案 0 :(得分:2)

@jkiiski在我的问题下方的评论中给出了正确的答案,但我想发布答案,以便将来遇到类似问题的任何人都可以解决该问题。正如@jkiiski所说,cl-who软件包中有一个名为 ATTRIBUTE-QUOTE-CHAR 的变量,默认为#\'。您可以简单地将该变量设置为#\“,以便将默认引号用作双引号:

(setf *attribute-quote-char* #\")

在文件顶部附近添加该行代码后,我的html默认为:

onclick="alertUser('id')"

,现在javascript可以正确执行了。将正确答案归功于@jkiiski。