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)
4

2 回答 2

2

请参阅mappend 上的文档!

(require racket/mpair)
(mappend! ml1 ml2)
于 2012-07-12T08:47:52.223 回答
0

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

例如,使用您的定义,这应该可以附加ml2ml1

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

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

于 2012-07-13T15:25:42.893 回答