使用
(write 'a)
给出结果A
,所以我猜'a
与#\A
相同(Lisp中字符A的表示)。但是
(write-char 'a)
给出错误*** - WRITE-CHAR: argument A is not a character
。那么'a
是什么?
使用
(write #\a)
给出结果#\a
,所以我想对于write
函数,#\a
被用作字符串;但为什么不需要将#\a
放在双引号中,即"#\a"
。
答案 0 :(得分:2)
TL; DR:'a
不是字符。
Lisp具有一些基本数据类型:
"Hello, world!"
,与字符数组相同#\A
。 lisp实施允许具有多种类型的字符(例如Unicode和ascii),但大多数没有。'a
,有时写成A
。符号基本上是指向字符串的指针,外加一些其他信息,通常在称为包的哈希表中查找(也称为内联)符号,因此,如果两个符号看起来相同,则它们等同于指针。 lisp阅读器(即解析器)通常会在将符号插入之前将其转换为大写 Lisp代码由lisp对象组成,通常将符号视为变量查找,因此,如果尝试使用A
来写符号(write a)
,则会出现关于A
的错误未定义。
那么如何用Lisp表达符号A
?好吧,有一个特殊的quote
运算符:
CL-USER> (quote a)
A
lisp评估(quote x)
的方式是,它只返回源代码x
中的任何lisp对象,因此,例如(quote (a b c))
得出符号A
,B
和C
的列表
最后,lisp的'x
具有语法糖(quote x)
,因此'(a b c)
与(quote (a b c))
完全相同
CL-USER> (list 'quote (list 'a 'b 'c)
'(A B C)
最后,函数write
通常尝试以Lisp语法编写对象。这样您就会得到:
CL-USER> (write "good")
"good"
"good"
请注意一个是write
编写的字符串,另一个是REPL打印的返回值。
CL-USER> (read-from-string "A")
A
CL-USER> (read-from-string "#\\A")
#\A
因此,您看到write
试图以read.
可以理解的方式格式化事物
答案 1 :(得分:2)
字符,符号...
那是什么'a
'a
是(quote a)
的缩写。 (quote a)
的计算结果为符号a
。
所以我想,对于写函数,#\ a用作字符串;但为什么不需要在双引号中加上#\ a,即“#\ a”。
否,#\a
是一个字符对象。
阅读入门书籍,而不是参考语言
您可能想阅读Lisp入门书籍,而不是更复杂的语言参考。我会推荐David S. Touretzky撰写的Paul Graham的书ANSI Common Lisp或Common Lisp: A Gentle Introduction to Symbolic Computation。后者可供下载。