方案清单修改

时间:2010-09-18 20:46:39

标签: regex list scheme

我正在尝试编写一个带有表单列表的方案函数:

((#f ((1 1) (2 1)))
 (#f ((1 3) (5 1)))
 (#f ((1 4) (7 1)))
)

并删除所有#f以提供如下列表:

( ((1 1) (2 1))
  ((1 3) (5 1))
  ((1 4) (7 1))
)

我已尝试过以下代码,但无法使其正常工作:

(define meth
  (lambda lst
    (if (equal? (cdr lst) '())
      (cdr (car lst))
      (cons (list-ref (car lst) 1) (meth (cdr lst))))))

有谁知道怎么做?感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用mapcdr函数应用于列表中的每个子列表,如下所示:(map cdr lst)。但是这会给你

( (((1 1) (2 1)))
  (((1 3) (5 1)))
  (((1 4) (7 1)))
)

用于您的样本输入,这是一个比您的样本输出更多的嵌套级别。因此,要获取示例输出,请使用list-ref获取每个子列表的第二个元素:

(define (meth lst) (map (lambda (x) (list-ref x 1)) lst))

编辑:正如Eli Barzilay所指出的,有cadr函数来获取列表的第二个元素,因此可以缩短为:

(define (meth lst) (map cadr lst))

答案 1 :(得分:2)

这是一种更接近你所拥有的方式:

(define meth
  (lambda (lst)
    (cond
      ((null? lst) '())
      ((cons (cadr (car lst)) (meth (cdr lst))))
      )
    )
  )


(define a '(
            (#f ((1 1) (2 1)))
            (#f ((1 3) (5 1)))
            (#f ((1 4) (7 1)))
            ))