> (equal? '(1 4) (car '('(1 4))))
#f
哎呀,上面的结果应该是#t,因为这些片段的结果是#t
如下:
> (car '('(1 4)))
'(1 4) ; Scheme doesn't get confused by list of a single list
> (equal? '(1 4) '(1 4))
#t. ; Scheme can see the equality of lists
这一定是一些疯狂的范围界定事物或相同的地址事物?测试同一地址的东西?如果我们把它分解,我们仍然得到#f,这表明相等?s-表达式有自己的作用域吗?
> (define piece (car '('(1 4))))
> piece
'(1 4)
> (equal? '(1 4) piece)
#f
平等的?应该迭代每个正在比较的列表的成员,如果所有成员对都相等(事实确实如此),则返回#t。所以,这很奇怪,我一定从根本上不理解 car 或嵌套 s 表达式。
它在 sbcl 中也失败了,所以发生了一些我不明白的黑暗神秘的事情:
* (equalp '(1 4) (car '('(1 4))))
NIL
* (car '('(1 4)))
'(1 4)
* (equalp '(1 4) '(1 4))
T
*
它在 Racket 中也失败了:
Welcome to DrRacket, version 8.9 [cs].
Language: racket/base, with debugging; memory limit: 128 MB.
> (equal? '(1 4) (car '('(1 4))))
#f
这里是成员的定义?Abelson 和 Sussman SICP 的函数:
(define (member? x list)
(if (null? list) #f
(if (equal? x (car list)) #t
(member? x (cdr list)))))
我想我写了完全相同的东西:
(define (my-member item lst)
(if (null? lst)
#f
(if (equal? item (car lst))
#t
(my-member item (cdr lst)))))
所以,我是问题所在,但我不明白。这在语义上似乎很明显。
你有一个额外的报价。当您使用 quote 时,它会引用整个表达式,而无需引用子表达式。
所以应该是:
当您引用子表达式时,您将返回一个列表,其第一个元素是文字符号
quote
。由于 不等于1
,因此两个表达式不相等。