为什么Lisp中的单引号总是返回大写?

时间:2015-08-11 13:49:24

标签: format common-lisp single-quotes

我希望能够从单引号中设置案例,但这似乎不可能。

(format nil "The value is: ~a" 'foo)
"The value is: FOO"

(format nil "The value is: ~a" 'FOO)
"The value is: FOO"

(format nil "The value is: ~a" "Foo")
"The value is: Foo"

5 个答案:

答案 0 :(得分:11)

<强>引用

报价与案件无关。 undefined会阻止评估。

引用符号:

quote

引用一个清单:

CL-USER 1 > 'foo
FOO

你可以在许多事情面前加上引用。例如,在字符串前面:

CL-USER 2 > '(1 2 3 foo)
(1 2 3 FOO)

由于字符串对自己进行评估,引用或不引用它们没有区别:

CL-USER 3 > '"a b c"
"a b c"

默认情况下,符号读为大写:

CL-USER 4 > "a b c"
"a b c"

但这与引用无关,是阅读器的功能

CL-USER 5 > 'FooBar
FOOBAR

CL-USER 6 > (symbol-name 'FooBar)
"FOOBAR"

<强> Downcase

如果您希望字符串为小写,则需要将字符串转换为小写:

CL-USER 7 > (read-from-string "foo")
FOO
3

带大小写混合的符号

但您可以创建小写名称或大小写混合的符号。你需要逃脱它们:

CL-USER 8 > (string-downcase (symbol-name 'FooBar))
"foobar"

使用CL-USER 9 > '|This is a symbol With spaces and mixed case| |This is a symbol With spaces and mixed case| CL-USER 10 > 'F\o\oB\a\r |FooBar|

下传输出

您还可以告诉FORMAT以小写字母打印:

FORMAT

答案 1 :(得分:1)

要了解正在发生的事情,请参阅Rainer Joswigs的回答。只需添加一件事:您可以使用*print-case*控制打印符号的大小写(没有竖线条句法):

CL-USER 1 > (let ((*print-case* :downcase))
              (format nil "The value is: ~a" 'foo))
"The value is: foo"

CL-USER 2 > (let ((*print-case* :capitalize))
              (format nil "The value is: ~a" 'foo))
"The value is: Foo"

CL-USER 3 > (let ((*print-case* :upcase)) ; default
              (format nil "The value is: ~a" 'foo))
"The value is: FOO"

答案 2 :(得分:0)

Lisp符号(如'a)不区分大小写。您可以通过执行...

来检查
(eq 'a 'A)

它们是相同的符号。

如果需要区分大小写,则应根据需要使用字符串或字符。

为了在特定情况下制作format个符号,您可以set the *print-case* global variable:upcase:downcase:capitalize,具体取决于您的需求。< / p>

答案 3 :(得分:0)

'foo表示“抑制符号FOO的评估,仅留下符号FOO”。 Common Lisp默认会提升符号名称(因此表示为'foo'Foo'FOO的符号都是相同的符号,符号名称为"FOO")。< / p>

要准确了解您的实施内容,您可以通过调用(readtabe-case *readtable*)来查看当前可读表格see CLHS, ch 23.1.2, effect of readtable case的可读表格。

一些lisp实现将从readtable-case开始为:preserve

至于你是否应该使用符号或字符串,它是“它依赖”的其中之一。如果您不担心cse保存,使用实习符号可以减少存储空间并提高比较速度,从而可能(在可能的情况下)进行大量修改。但是,如果情况很重要,那么平衡可能会进一步朝着“使用整个字符串”结束。

答案 4 :(得分:-1)

好的,这有效:

(format nil "The value is: ~a" (string-downcase 'foo))
"The value is: foo"

更好(来自Rainer)

 (format nil "The value is: ~(~a~)" 'foo)

我仍然认为不应该使用&f;而不是&#34; foo&#34;如果意图是表示字符串。