Scheme过滤但结果列表包含索引而不是值

时间:2017-03-31 07:55:12

标签: scheme racket

有没有简单的方法来创建一种过滤器,结果是索引而不是值?

例如:

'(#true #false #true) -> '(0 2)

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)