3.2 等式 (Equality)
每一次你调用 cons
时, Lisp 会配置一块新的内存给两个指针。所以如果我们用同样的参数调用 cons
两次,我们得到两个数值看起来一样,但实际上是两个不同的对象:
> (eql (cons 'a nil) (cons 'a nil))
NIL
如果我们也可以询问两个列表是否有相同元素,那就很方便了。 Common Lisp 提供了这种目的另一个判断式: equal
。而另一方面 eql
只有在它的参数是相同对象时才返回真,
> (setf x (cons 'a nil))
(A)
> (eql x x)
T
本质上 equal
若它的参数打印出的值相同时,返回真:
> (equal x (cons 'a nil))
T
这个判断式对非列表结构的别种对象也有效,但一种仅对列表有效的版本可以这样定义:
> (defun our-equal (x y)
(or (eql x y)
(and (consp x)
(consp y)
(our-equal (car x) (car y))
(our-equal (cdr x) (cdr y)))))
这个定义意味着,如果某个 x
和 y
相等( eql
),那么他们也相等( equal
)。
勘误: 这个版本的 our-equal
可以用在符号的列表 (list of symbols),而不是列表 (list)。
当前内容版权归 readthedocs 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 readthedocs .