使用索引 MIT 方案过滤列表

Filtering a list with indexes MIT-scheme

有没有什么好的方法可以使用方案中的每个元素及其索引来过滤列表?我现在就是这样做的,但它似乎过于复杂

(map cdr
     (filter (lambda (index-and-element)
               (filter-proc (car index-and-element) 
                            (cdr index-and-element)))
             (map cons (iota (length l))
                       l)))

我觉得非常好。除了,也许你的意思是 map cdr...

就我个人而言,只要有可能,我都喜欢非常短的变量名,所以我不使用 index-and-element,而是使用 ie——它们不重要,只是一些连接,所以让它们尽可能不可见可能。

另一种可能性是最初使用(map list ...),而不是(map cons ...),然后在lambda中使用(apply filter-proc ie)。这样 filter-proc 被调用时有两个参数,所以它可以被定义为 (define (filter-proc idx elt) ...).

毕竟,由于每次都重新键入所有这些确实很复杂且容易出错,我们为此定义一个高阶函数以便更容易使用,例如

(define (indexed-filter ipred lst)
   (filter (lambda (ie)
               (apply ipred ie))
           (map list (iota (length lst))
                     lst)))

;; (define (ipred idx elt) ....)  ; returns Bool

并在需要时使用

我特意省略了 (map cadr ...) post 处理步骤,因为有时您可能想要获取匹配元素的索引而不是元素本身。所以 that 可以说是调用“协议”的一部分——无论您对索引、元素或两者都感兴趣,您只需调整对这个通用过程的调用.