会员?球拍功能

时间:2013-03-18 14:39:36

标签: scheme racket

我在2011年UC Berkeley site关注Brian Harvey的SICP讲座。他正在使用STk interpreter来教授课程,我正在和DrRacket一起使用球拍。我试图定义他在课堂上使用的所有未在球拍中定义的函数(即wordbutfirstbutlast)以进行额外练习。

我遇到了一个试图定义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)))

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

2 个答案:

答案 0 :(得分:4)

您可以使用sequence-ormap

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

测试:

> (member? 7 17)
#t
> (member? #\e "Hello")
#t

答案 1 :(得分:1)

现在您知道Racket函数sequence-ormap可以帮助学习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?))