我想写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)
答案 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函数,并考虑传入的空列表和什么不是。