附加两个可变列表

时间:2012-07-11 06:39:53

标签: racket

我想写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 个答案:

答案 0 :(得分:2)

请参阅mappend!

上的文档
(require racket/mpair)
(mappend! ml1 ml2)

答案 1 :(得分:0)

基本策略是通过重复调用mcdr来到达第一个列表的末尾,然后使用set-mcdr!将第一个列表的最后一个cons单元设置为第二个清单。

例如,使用您的定义,这应该可以将ml2附加到ml1

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

现在你所要做的就是把它变成一个任意大小的mlist函数,并考虑传入的空列表和什么不是。