Scheme,搜索单词是列表的一部分

时间:2013-10-13 20:11:44

标签: list scheme

我做了一个程序,它正在搜索一个元素是否是列表的一部分,但它不能处理单词 我的节目:

(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 

请帮忙。

3 个答案:

答案 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的值,您可能更愿意根据andor重写

答案 2 :(得分:-1)

eq?测试两个对象是否在内存中的位置相同。它实际上并不比较值。如果在两个不同的内存位置构造相同的字符串,eq?将返回false。请改用string=

我想展示一些示例代码但是Scheme正在积极地实现字符串,我不能让两个单独分配的相同字符串存在...

Relevant question