我想写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)
我想写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)
(require racket/mpair)
(mappend! ml1 ml2)
基本策略是通过重复调用到达第一个列表的末尾mcdr
,然后使用set-mcdr!
将第一个列表的最后一个 cons 单元格设置为第二个列表的头部。
例如,使用您的定义,这应该可以附加ml2
到ml1
(set-mcdr! (mcdr (mcdr ml1)) ml2)
(mlist->list m1) ; => '(1 2 3 4 5 6)
现在你所要做的就是把它变成一个用于任意大小的 mlist 的函数,并考虑传入的空列表和其他什么。