String 将Common Lisp中的宏参数视为(区分大小写)字符串
(这是其中一件看起来应该如此简单的事情,我认为可能有更好的方法) 我试图定义一个宏(用于CLISP),该宏接受可变数量的参数作为符号(然后转换为区分大小写的字符串) 将符号转换为大写字符串,而String 将Common Lisp中的宏参数视为(区分大小写)字符串,string,common-lisp,symbols,case-sensitive,String,Common Lisp,Symbols,Case Sensitive,(这是其中一件看起来应该如此简单的事情,我认为可能有更好的方法) 我试图定义一个宏(用于CLISP),该宏接受可变数量的参数作为符号(然后转换为区分大小写的字符串) 将符号转换为大写字符串,而 (defmacro symbols-to-words (&body body) `(join-words (mapcar #'symbol-name '(|,@body|)))) 将@body视为单个符号,不进行扩展 有什么想法吗?我认为可能有一种更简单的方法。在读卡器步骤中,符号名称是大写
(defmacro symbols-to-words (&body body)
`(join-words (mapcar #'symbol-name '(|,@body|))))
将@body视为单个符号,不进行扩展
有什么想法吗?我认为可能有一种更简单的方法。在读卡器步骤中,符号名称是大写的,这发生在宏扩展之前,因此,您无法使用宏来影响这一点。您可以全局设置,但这将影响所有代码,尤其是您必须在源代码中以大写形式编写所有标准符号。CLISP还有一个“-modern”选项,它为标准库的名称提供小写版本,并将读卡器设置为保留大小写,但它本身是非标准的。我自己从来没有使用过它,所以我不确定实际应用的注意事项是什么
控制读卡器的另一种方法是通过读卡器宏。Common Lisp已经有一个读卡器宏实现了区分大小写字符串的语法:the。如果不知道您为什么不使用它,就很难提供更多的建议。正如拉马伦正确地说的那样,符号的情况是在读取期间确定的。不是在宏扩展时 Common Lisp有一种语法,用于在不更改大小写的情况下指定符号:
|这是一个符号|
-使用竖条作为多重转义字符
还有一个反斜杠-一个转义字符:
CL-USER > 'foo\bar
|FOObAR|
其他选择包括:
- 使用不同的全局可读大小写
- 使用读取并保留大小写的读取宏
- 使用使用自己的读卡器的读宏
|、@body |
(body拼接在其中)的语法。中的拼接仅适用于列表,而不适用于符号名称|
,竖条,环绕符号的字符元素。公共Lisp Hyperspec中的解释有点含糊不清:
CL-USER > 'foo\bar
|FOObAR|