为什么Parenscript函数被改成全小写?

7

当使用parenscript时,如果我执行以下代码:

(parenscript:ps 
 (slot-value ($ "#mytextarea") 'selectionStart))

它会产生以下javascript代码:

$('#mytextarea').selectionstart;

请注意,selectionStart现在变成了selectionstart。它失去了Start上的大写字母!我该如何保留那个大写字母S?


2
默认情况下,Common Lisp表单(Parenscript输入)由读取器折叠大小写(转换为大写)。selectionStart将变成SELECTIONSTART,然后Parenscript在生成JavaScript输出时可能会将其转换为小写。 - Pillsy
2个回答

6

ParenScript会自动将lisp命名惯例(使用破折号分隔单词)转换为CamelCase,因此:

(parenscript:ps 
 (slot-value ($ "#mytextarea") 'selection-start))

导致
"$('#mytextarea').selectionStart;"

1
如果您需要在您的符号中使用首字母大写,您需要在名称前加上一个星号。 - HD.

1

正如Pillsy所指出的那样,当Lisp编译器读取符号时,默认情况下所有符号都是大写的。不过,有一种方法可以关闭这个功能。请参见CLHS, 23.1.2 (Effect of Readtable Case on the Lisp Reader)以及访问器readtable-case的描述以获取详细信息。例如,您可以通过将以下内容放入Lisp源文件中来启用“反转”模式(这可能是唯一实用的、同时也区分大小写的设置):

#.(setf (readtable-case *readtable*) :invert)

不幸的是,ParenScript似乎不太使用自定义readtable-case设置,尽管它可以(并且在我看来应该)这样做。


你会如何说Parenscript可以最好地利用readtable-case?Parenscript编译器将代码作为带有符号的s表达式获取,因此它不知道符号名称是如何读取的。现在有一个compile-file函数,您可以自定义阅读器,但这对于所有PS代码都不起作用。 - user62715
@vsedach 这是真的。尽管如此,在我看来,对于混合大小写符号该怎么处理是非常清楚的(保持不变),所以唯一剩下的问题是如何处理全大写和全小写符号。就个人而言,我建议默认情况下假定为:INVERT,或者只需将所有这些符号转换为小写字母(为了向后兼容性),并将其作为READTABLE-CASE一样的设置。 - Matthias Benkard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接