Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 将Common Lisp中的宏参数视为(区分大小写)字符串_String_Common Lisp_Symbols_Case Sensitive - Fatal编程技术网

String 将Common Lisp中的宏参数视为(区分大小写)字符串

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视为单个符号,不进行扩展 有什么想法吗?我认为可能有一种更简单的方法。在读卡器步骤中,符号名称是大写

(这是其中一件看起来应该如此简单的事情,我认为可能有更好的方法)

我试图定义一个宏(用于CLISP),该宏接受可变数量的参数作为符号(然后转换为区分大小写的字符串)

将符号转换为大写字符串,而

(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|
其他选择包括:

  • 使用不同的全局可读大小写
  • 使用读取并保留大小写的读取宏
  • 使用使用自己的读卡器的读宏
还要注意的是,公共Lisp中不存在类似于
|、@body |
(body拼接在其中)的语法。中的拼接仅适用于列表,而不适用于符号名称
|
,竖条,环绕符号的字符元素。公共Lisp Hyperspec中的解释有点含糊不清:

CL-USER > 'foo\bar
|FOObAR|