为什么当子表达式起作用时,这个Scheme s表达式不起作用?

问题描述 投票:0回答:1
> (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)))))

所以,我就是问题所在,但我不明白。这在语义上似乎很明显。

scheme
1个回答
0
投票

您有额外的报价。当您使用 quote 时,它会引用整个表达式,您不需要引用子表达式。

所以应该是:

> (equal? '(1 4) (car '((1 4))))
#t

当您引用子表达式时,您将返回一个列表,其第一个元素是文字符号

quote
。由于它不等于
1
,因此两个表达式不相等。

© www.soinside.com 2019 - 2024. All rights reserved.