我正在尝试使用会员?用于确定用户输入中特定字符串的存在。
会员?功能是使用是:
(define (member? item seq)
(sequence-ormap (lambda (x)
(equal? item x))
seq))
但是,我的程序结构要求我进行以下比较:
(会员?'(姓名)'(基地名称))
其输出示例如下:
> (car (car *strong-cues*))
'((the names) (their names))
> (car (car (car *strong-cues*)))
'(the names)
> (member? (car (car (car *strong-cues*))) '(the names of the basemen))
#f
"姓名"很明显在用户的输入中(在这种情况下是"基本人的姓名")然而,我看到的问题是这就是正在发生的事情:
(名称)是&或者?'或者'或者' basemen?
有没有办法正确地进行这种比较,以便搜索"名称"如果"名称"将返回true是用户输入中的一个字符串?
答案 0 :(得分:3)
由于您在列表中搜索子列表,因此根本不是member
。因为你不能使用ormap
,因为每次迭代只有一个元素,而你期望比较几个元素。我建议你制作prefix?
:
(define (prefix? what lst)
; implementation left as exercise
<???>)
(prefix? '(b c) '(a b c d)) ; ==> #f
(prefix? '(b c) '(b c d)) ; ==> #t
这是一个相当简单的递归方法,您可以将元素与元素进行比较,直到搜索列表为空。如果每个元素测试都是假的或干草堆是空的那么它就是假的。然后,您可以轻松地使用它find-sublist
:
(define (find-sublist sub lst)
(cond ((null? lst) #f)
((prefix? sub lst) lst)
(else (find-sublist sub (cdr lst))))))
(find-sublist '(c d) '(a b c d e f)) ; ==> (c d e f)
这里我返回带有前缀的列表,就像成员一样,但是可以很容易地将其更改为你想要的任何内容.. index,#t
等。