2011-11-30 65 views
2

我寫了使用汽車和CDR,並做一個大項目:方案 - 車空列表/ 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() 

我該怎麼辦?

+0

那麼,如果(b c ...)是空的,你希望它做什麼?返回空列表? – Shaun

+0

@shaun:沒什麼。 (b c ....)我不需要它們。我嘗試刪除空白列表,但沒有成功。 –

回答

1

您是否嘗試過濾掉空列表map?事情是這樣的:

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

的根本問題是()是不是一對,而car僅作用於對。最簡單的解決方案就是在將car映射到列表之前擺脫所有不是一對的東西;這是(filter pair? ...)所做的。

+1

我相信它應該是'(地圖車(過濾器對?(附加(地圖caddr列表)(地圖cadr列表))))' – mangoDrunk

+0

@mangoDrunk:你是對的;我只是沒有引起足夠的重視。 –

1

這是我的鏡頭。這是一個直接的解決方案,不使用map,filter;以這種方式,我避免重複構建中間列表的列表元素 - 除了我使用reverse操作來保留元素的原始順序以外,如果這不是問題,請刪除reverse。對於原始列表中的每個元素,如果(b)... (c)...部分爲空,則會跳過。

(define (process lists) 
    (let loop ((l (reverse lists)) 
      (a '()) 
      (b '())) 
    (cond ((null? l) 
      (append b a)) 
      ((or (not (pair? (cadar l))) (not (pair? (caddar l)))) 
      (loop (cdr l) a b)) 
      (else 
      (loop (cdr l) (cons (caadar l) a) (cons (car (caddar l)) b))))))