Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Racket 附加两个可变列表_Racket - Fatal编程技术网

Racket 附加两个可变列表

Racket 附加两个可变列表,racket,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->

我想写
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)
请参阅上的文档


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

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

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

现在,您所要做的就是将其转换为一个用于任意大小的mlists的函数,并解释传入的空列表和未传入的空列表。

堆栈溢出不是一个“给我代码”站点。你尝试过什么?@willinessinracket不变性是列表的默认设置。因此,
list
返回一个不可变的列表。要获得可变列表,必须使用
mlist
。简而言之,所有(几乎)列表操作都有两种风格。那些在可变列表上工作的人通常有一个名字,名字是
m
@soegaard谢谢!(太糟糕了,OP对标签的使用太鲁莽了…)
(set-mcdr! (mcdr (mcdr ml1)) ml2)
(mlist->list m1) ; => '(1 2 3 4 5 6)