CL-WHO 总是以单引号开头
CL-WHO is always starting with a single quote
我的问题是,当 CL-WHO 将 Lisp S-表达式转换为 html 输出时,它以单引号市场开始每个表达式。大多数时候这没问题,但这是一个问题,因为我正在将我的文件链接到外部 javascript 文件。我试图让这个项目变得简单,并且由于我团队中 javascript 开发人员中的 none 知道 Common Lisp,因此使用 parenscript 可能不可行。这是我的问题示例和程序中的错误之一:
:onclick "alertUser('id')"
当在 html 文档中按下特定元素时,这应该会触发一个名为 alertUser 的 JavaScript 函数,并且标签的 ID 应该传递给 JavaScript 函数作为论据。但无论我做什么,CL-WHO 都会将该字符串转换为单引号,所以我最终会得到一个无效的表达式。这是该代码转换为的内容:
onclick='alertUser('id')'>
一切都是单引号,所以 'alertUser(' 作为第一个字符串传递,这显然是无效的,我在我的开发人员工具中收到一个语法区域。我认为我可以通过使用带有转义字符的格式函数来解决这个问题。这相当于:
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 在这些情况下使用双引号而不是单引号?
@jkiiski 在我的问题下方的评论中给出了正确答案,但我想 post 答案以便将来遇到类似问题的任何人都可以解决问题。正如@jkiiski 所说,cl-who 包中有一个名为 ATTRIBUTE-QUOTE-CHAR 的变量,默认为 #\'。您可以简单地将该变量设置为 #\",以便默认引号使用双引号:
(setf *attribute-quote-char* #\")
在文件顶部附近添加该行代码后,我的 html 默认为:
onclick="alertUser('id')"
现在 javascript 可以正常执行了。感谢@jkiiski 的正确答案。
我的问题是,当 CL-WHO 将 Lisp S-表达式转换为 html 输出时,它以单引号市场开始每个表达式。大多数时候这没问题,但这是一个问题,因为我正在将我的文件链接到外部 javascript 文件。我试图让这个项目变得简单,并且由于我团队中 javascript 开发人员中的 none 知道 Common Lisp,因此使用 parenscript 可能不可行。这是我的问题示例和程序中的错误之一:
:onclick "alertUser('id')"
当在 html 文档中按下特定元素时,这应该会触发一个名为 alertUser 的 JavaScript 函数,并且标签的 ID 应该传递给 JavaScript 函数作为论据。但无论我做什么,CL-WHO 都会将该字符串转换为单引号,所以我最终会得到一个无效的表达式。这是该代码转换为的内容:
onclick='alertUser('id')'>
一切都是单引号,所以 'alertUser(' 作为第一个字符串传递,这显然是无效的,我在我的开发人员工具中收到一个语法区域。我认为我可以通过使用带有转义字符的格式函数来解决这个问题。这相当于:
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 在这些情况下使用双引号而不是单引号?
@jkiiski 在我的问题下方的评论中给出了正确答案,但我想 post 答案以便将来遇到类似问题的任何人都可以解决问题。正如@jkiiski 所说,cl-who 包中有一个名为 ATTRIBUTE-QUOTE-CHAR 的变量,默认为 #\'。您可以简单地将该变量设置为 #\",以便默认引号使用双引号:
(setf *attribute-quote-char* #\")
在文件顶部附近添加该行代码后,我的 html 默认为:
onclick="alertUser('id')"
现在 javascript 可以正常执行了。感谢@jkiiski 的正确答案。