我在原始的lisp中看到,CONS在内存中以36位表示,18个第一位用于CAR(15位是地址,3位表示它是ATOM的地址还是另一个CONS),后18位是对于CDR(15位......)。我的问题是如果需要多于一个字节的ATOM的表示是什么,例如对于字符串?
答案 0 :(得分:4)
“Lisp”是语言的系列,而不是单一语言。家族中的许多语言(例如,Common Lisp)不指定内部表示,而是指定结构和函数必须保留的合同。在缺点的情况下,它大致是等式:
(car (cons x y)) == x
(cdr (cons x y)) == y
并且要求缺点每次调用时都会返回一个新对象。在一些Lisp中,cons单元是不可变的,因此不存在返回新对象的要求。
当然,实际上有实现,他们确实需要存储东西,并且询问他们是如何做到这一点并不是不合理的。一般来说,最好将缺点单元格视为一个足以容纳两个指针的结构,并且可能有一些信息保持其类型(因此可以将其识别为 cons < / strong> cell)。然而,实现方式使用的指针可以被标记,因此,例如,如果前三位是某些特殊值,则“指针”可以被识别为某个原始值的编码。
这里的重要部分是你通常不需要知道机器上的底层表示,以及你所做的情况(例如,如果你正在编写代码来与另一种语言交互(例如,C) )),那么你正在寻找的答案将特定于每个实现。
答案 1 :(得分:1)
第一个LISP没有字符串。它只有符号和缺点。如何存储符号字母在John McCarthy's paper中略有描述。这些字母被编码为6位,每个地址为5个空间。列表(称为关联列表)放在一起,这样您就可以有超过5个字母的符号。
用户永远不会触摸这些结构,所以你如何做到这一点并不重要。我在BrainF * ck中创建了自己的McCarthy Lisp Zozotez,并将我的符号名称编码为cons
,其中car
始终是ascii值,cdr
或者是新的有一封信或NIL
。
PS:Modern Lisps将字符作为基本类型,类似于符号。 String是一系列字符。 Common Lisp使用具有特殊类型的一维数组(=向量)来区分字符串与其他数组,并要求它们具有字符元素。与其他矢量和列表一样,您不能仅仅将其作为值进行比较,而是使用字符串谓词或equal
和equalp
来比较序列的各个部分。
答案 2 :(得分:0)
最常见的是,引用符号的cons单元格只包含指向描述它的某个结构的指针。因此EQ可以实现为指针比较。这三个附加位用于保存某些类型信息,因此即使是FIXNUMS也可以通过这种方式进行编码和比较。