当 Scheme 遇到 a(quote x)
或其缩写形式时'x
x 是未评估的结果。从而(quote ((quote three) (quote four) (quote five)))
成为列表((quote three) (quote four) (quote five))
。我认为您的意思是 pass (quote (three four five))
,您可以编写它'(three four five)
并且您的程序会起作用,因为您正在搜索的是第一个元素。
如果搜索的元素不是 lst 中的第一个元素,则会出现一个错误,即您有一个未绑定的变量使其无法工作。x
我猜这实际上应该是绑定变量xs
。我已将 every 重命名xs
为x
(因为 xs 通常表示一个列表,而这里它是一个搜索元素)
(define (element? x lst)
(cond ((null? lst) #f)
((eq? x (car lst)) #t)
(else (element? x (cdr lst)))))
(element? 'c '(a b c d e f)) ; ==> #t
(element? 'g '(a b c d e f)) ; ==> #f
(element? (quote e) (quote (a b c d e))) ; ==> #t
如果您真的想搜索符号以外的其他内容,则应使用equal?
代替eq?
,如下所示:
(define (element? x lst)
(cond ((null? lst) #f)
((equal? x (car lst)) #t)
(else (element? x (cdr lst)))))
(element? '(hello dolly) '((hello paul) (hello dolly) (hello todd))) ; ==> #t