有没有简单的方法来创建一种过滤器,结果是索引而不是值?
例如:
'(#true #false #true) -> '(0 2)
答案 0 :(得分:2)
您可以创建一个自定义过滤器过程,该过程返回列表元素的索引列表,其中谓词生成真值,如下所示:
(define (filtr pred lst)
(for/list ([i lst]
[n (in-naturals)]
#:when (pred i))
n))
例如,
> (filtr number? '(1 2 3 a b c 8 d 19 e f))
'(0 1 2 6 8)
> (filtr (lambda (x) (and x)) '(#true #false #true))
'(0 2)
答案 1 :(得分:0)
当然有办法做到这一点;有很多方法可以做到这一点。这是一种方式。
(define (func xs)
(let loop ((index 0) (xs xs))
(cond ((empty? xs) empty)
((car xs) (cons index (loop (add1 index) (cdr xs))))
(else (loop (add1 index) (cdr xs))))))
(func '(#true #false #true #false #false #true #true))
;; => '(0 2 5 6)