我正在尝试编写一个带有表单列表的方案函数:
((#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))))))
有谁知道怎么做?感谢。
答案 0 :(得分:2)
您可以使用map
将cdr
函数应用于列表中的每个子列表,如下所示:(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)))
))