令人困惑(write'a)(write#\ a)(write-char#\ a)(write-char'a)

时间:2019-01-13 14:35:10

标签: common-lisp

使用

(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"

我已经在herehere上了解了write,write-char函数;关键字 lisp'a

搜索时很难找到预期的结果

2 个答案:

答案 0 :(得分:2)

TL; DR:'a不是字符。

Lisp具有一些基本数据类型:

  • 字符串,例如"Hello, world!",与字符数组相同
  • 字符,例如#\A。 lisp实施允许具有多种类型的字符(例如Unicode和ascii),但大多数没有。
  • 号码,例如1.5。这些可以细分为fixnum,bignum和各种float,以及bit等子类型。
  • 符号,例如'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))得出符号ABC的列表

最后,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 LispCommon Lisp: A Gentle Introduction to Symbolic Computation。后者可供下载。