球拍计划 - 会员?功能难题

时间:2016-11-25 22:02:05

标签: scheme lisp racket

我正在尝试使用会员?用于确定用户输入中特定字符串的存在。

会员?功能是使用是:

    (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是用户输入中的一个字符串?

1 个答案:

答案 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等。