2012-07-11 16 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和占空列表功能而不是什么。