我做了一个程序,它正在搜索一个元素是否是列表的一部分,但它不能处理单词 我的节目:
(define (element? xs lst)
(cond ((null? lst) #f)
((eq? xs (car lst)) #t)
(#t (element? x (cdr lst)))))
的示例:
>(element? 'three (quote ((quote three) (quote four) (quote five))))
>,=> #f but i need #t
请帮忙。
答案 0 :(得分:1)
当Scheme遇到(quote x)
或其简短形式'x
x时,结果未经评估。因此(quote ((quote three) (quote four) (quote five)))
成为列表((quote three) (quote four) (quote five))
。我认为你打算通过(quote (three four five))
,你可以写'(three four five)
并且你的程序会有效,因为你所搜索的是第一个元素。
如果搜索到的元素不是lst中的第一个元素,则会出现一个错误,即您有一个未绑定的变量使其无效。我想x
实际上应该是绑定变量xs
。我已将每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
答案 1 :(得分:0)
在Scheme中,确实没有“单词”的概念 - 你有符号或字符串。从你写的东西,你正在寻找符号。您的代码有许多简单的错误,这是一个简单的版本:
(define (element? xs lst)
(and (not (null? lst))
(or (eq? xs (car lst))
(element? xs (cdr lst)))))
> (element? 'three (list 'three 'four 'five))
#t
注意:只要您看到cond
返回#t
或#f
的值,您可能更愿意根据and
和or
重写
答案 2 :(得分:-1)
eq?
测试两个对象是否在内存中的位置相同。它实际上并不比较值。如果在两个不同的内存位置构造相同的字符串,eq?
将返回false
。请改用string=
。
我想展示一些示例代码但是Scheme正在积极地实现字符串,我不能让两个单独分配的相同字符串存在...