方案 - 空列表上的汽车/ cdr

时间:2011-11-30 23:53:48

标签: scheme

我写了一个使用汽车和cdr的大程序,然后执行:

(map car (append (map caddr lists) (map cadr lists))

lists是下一格式的列表列表((a (b) (c)) (d (e) (f))...(x (y) (z)))时 当我这样做时,我得到一个列表(b c e f... y z) (注意:b,c,... y,z是数字列表; a,d ... x是符号)

但是现在,我发现b,c,...,y,z也可以是空列表,它会给出下一个错误:

car: expects argument of type <pair>; given ()

我该怎么办?

2 个答案:

答案 0 :(得分:1)

您是否尝试在map之前过滤掉空列表?像这样:

(map car (filter pair? (append (map caddr lists) (map cadr lists))))

根本问题是()不是一对,而car仅作对。car。最简单的解决方案就是在将(filter pair? ...)映射到列表之前摆脱不成对的一切;这是{{1}}的作用。

答案 1 :(得分:1)

这是我的镜头。这是一个直接的解决方案,不使用mapfilter;以这种方式,我避免遍历构建中间列表的列表元素 - 除了我使用reverse操作来保留元素的原始顺序,如果这不是问题,则删除{{1} }。对于原始列表中的每个元素,如果(b)... (c)...部分为空,则跳过它。

reverse