4

我正在关注 2011 年 Brian Harvey 在加州大学伯克利分校网站上的 SICP 讲座。他正在使用STk 解释器来教授课程,而我正在使用球拍和 DrRacket 来跟随。我正在尝试定义他在课堂上使用的所有未在球拍中定义的功能(即word, butfirst, butlast)以进行额外练习。

我遇到了一个试图定义的问题member?。他能够在列表和字符串上使用它,做类似的事情

(member? 1 (list 1 2 3 4)) ;; works
(member? 'a '(a e i o u)) ;; works
(member? 7 17) ;; doesn't work
(member? #\e "Hello") ;; doesn't work

这是我member?对上述适用/不适用的定义:

(define (member? u lst)
  (not (equal? (member u lst) #f)))

所以这是一个列表,所以前两个是有意义的,他们正在工作。甚至可以创建一个member?在 STk 中模仿的函数吗?我正在查看文档,它看起来像字符串、列表、非负整数和一堆其他东西被定义为sequence数据类型,但我找不到相关的序列函数。

4

2 回答 2

4

您可以sequence-ormap为此使用:

(define (member? item seq)
  (sequence-ormap (lambda (x)
                    (equal? item x))
                  seq))

去测试:

> (member? 7 17)
#t
> (member? #\e "Hello")
#t
于 2013-03-18T14:57:51.753 回答
1

现在你知道了sequence-ormap这里的 Racket 函数对学习 Scheme 有帮助:

(define (member? test item sequence)
  (cond ((string? sequence) (member? test item (string->list sequence)))
        ((vector? sequence) (member? test item (vector->list sequence)))
        ;; ...
        ((list? sequence) 
         (let looking ((l sequence))
           (and (not (null? l))
                (or (test item (car l))
                    (looking (cdr l))))))
        (else 'not-a-sequence)))

(define (member?-using-test test)
  (lambda (item sequence) (member? test item sequence))

(define member-equal? (member?-using-test equal?))
于 2013-03-18T15:15:32.500 回答