根据其值读取和重新创建列表

时间:2010-11-15 21:54:32

标签: scheme racket

我想根据其值创建列表的子集。例如:

List (AA AB BA DC AD)

我想要一个列表,其中包含从'A'开始的所有原子值 所以答案应该是:

(AA AB AD)

我目前可以通过遍历整个列表并将每个值转换为另一个列表并读取第一个值然后重新创建列表来实现此目的。

这是一个非常复杂的解决方案。

Scheme中是否有任何方法可以读取列表中字符串的第一个字符并删除该元素?

1 个答案:

答案 0 :(得分:5)

检查您的Scheme实现是否有一个名为filter的程序或类似的程序。如果没有,你可以自己定义一个:

(define (filter p lst)
  (let loop ((lst lst) (res ()))
    (if (null? lst)
        (reverse res)
        (if (p (car lst))
            (loop (cdr lst) (cons (car lst) res))
            (loop (cdr lst) res)))))

使用过滤器获取所有以'A'开头的原子:

> (filter (lambda (x) (char=? (string-ref (symbol->string x) 0) #\A)) 
          '(AA AB BA DC AD))
=> (AA AB AD)