> (equal? '(1 4) (car '('(1 4))))
#f
Opa, o acima deve ser avaliado como #t porque as peças resultam em #t
Do seguinte modo:
> (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
Deve ser alguma coisa maluca de escopo ou endereço igual? testes para coisas no mesmo endereço? Se dividirmos, ainda obteremos #f, o que sugere o igual? s-expression tem seu próprio escopo?
> (define piece (car '('(1 4))))
> piece
'(1 4)
> (equal? '(1 4) piece)
#f
igual? deve estar iterando sobre os membros de cada lista sendo comparada e retornar #t se todos os pares de membros forem iguais, o que eles são. Então, isso é estranho e devo estar fundamentalmente não entendendo o carro ou as expressões s aninhadas.
Ele também falha em sbcl, então há alguma coisa mística sombria acontecendo que eu não entendo:
* (equalp '(1 4) (car '('(1 4))))
NIL
* (car '('(1 4)))
'(1 4)
* (equalp '(1 4) '(1 4))
T
*
E também falha no Racket:
Welcome to DrRacket, version 8.9 [cs].
Language: racket/base, with debugging; memory limit: 128 MB.
> (equal? '(1 4) (car '('(1 4))))
#f
Aqui está a definição do membro? função de Abelson e Sussman SICP:
(define (member? x list)
(if (null? list) #f
(if (equal? x (car list)) #t
(member? x (cdr list)))))
Acho que escrevi exatamente a mesma coisa:
(define (my-member item lst)
(if (null? lst)
#f
(if (equal? item (car lst))
#t
(my-member item (cdr lst)))))
Então, eu sou o problema, mas não entendo. Parece semanticamente óbvio.
Você tem uma cotação extra. Quando você usa aspas, ele cita a expressão inteira, você não precisa colocar aspas nas subexpressões.
Assim deve ser:
Ao citar a subexpressão, você está retornando uma lista cujo primeiro elemento é o símbolo literal
quote
. Como não é igual a1
, as duas expressões não são iguais.