我在2011年UC Berkeley site关注Brian Harvey的SICP讲座。他正在使用STk interpreter来教授课程,我正在和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)))
所以这是一个列表,所以前两个有意义,他们正在工作。甚至可以在STk中创建一个模仿member?
的函数吗?我正在查看文档,它看起来像字符串,列表,非负整数和一堆其他东西被定义为sequence
数据类型,但我找不到相关的序列函数。
答案 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?))