2012-07-11 20 views
1

我想寫append!附加兩個可變列表

例如:如果我有

(define ml1 (mlist 1 2 3)) 
(define ml2 (mlist 4 5 6)) 
ml1 
ml2 

'#&(#&1 . #&(#&2 . #&(#&3 . #&()))) 
'#&(#&4 . #&(#&5 . #&(#&6 . #&()))) 

我希望能夠做到這一點:

(append! ml1 ml2) 
(mlist->list ml1) 
;; produces '(1 2 3 4 5 6) 
+2

堆棧溢出不是「給我codez」網站。你有什麼嘗試? – 2012-07-11 11:16:52

+1

什麼是* mlist *? – 2012-07-11 22:37:43

+0

@WillNess在球拍中,不變性是列表的默認值。因此'list'返回一個不可變列表。要得到一個可變列表,必須使用'mlist'。總之,所有(幾乎)列表操作都有兩種風格。那些在可變列表上工作的人通常會用'm'命名。 – soegaard 2012-07-12 10:05:22

回答

0

的基本策略將文件通過對mcdr的重複調用來到達第一個列表的末尾,並且th使用set-mcdr!將第一個列表的最後一個cons單元設置爲第二個列表的開頭。

例如,使用您的定義,這應該追加ml2ml1

(set-mcdr! (mcdr (mcdr ml1)) ml2) 
(mlist->list m1) ; => '(1 2 3 4 5 6) 

現在,所有你需要做的就是把它變成在傳遞任意大小mlists和佔空列表功能而不是什麼。