我试图理解cons和append之间的区别在于如何存储列表。考虑这个案例:
(define x '(hi, hello))
(define y '(randomvalue1, randomvalue2))
如果我假设打电话
这两个列表上的(cons x y)
将生成一个虚线对
其中第一个指针指向x
,第二个指针指向y
。
总而言之,x或y都没有改变。唯一添加内存的是虚线对。
但是当我用两个列表调用append时:
(append x y)
我认为,为了让球拍避免更改x
和y
,我们必须为x
和{{ 1}}按顺序。此列表没有指向y
或x
的任何指针。
我的假设是否正确?
答案 0 :(得分:2)
我更喜欢使用(list ...)
来编写列表,其中(list <a> <b> <c> <d>)
是(cons <a> (cons <b> (cons <c> (cons <d> empty))))
的简写
在提出问题之前,我想提一个问题:
(define x '(hi, hello))
(define y '(randomvalue1, randomvalue2))
将导致:
(list 'hi ',hello)
(list 'randomvalue1 ',randomvalue2)
你的意思是写:
(define x '(hi hello))
(define y '(randomvalue1 randomvalue2))
导致:
(list 'hi 'hello)
(list 'randomvalue1 'randomvalue2)
现在,对于您的问题,这里是append
:
(define (append x y)
(cond
[(empty? x) y]
[(cons? x) (cons (first x) (append (rest x) y))]))
直观地,它将x
析构为元素并重新排列元素以形成新列表。但是,y
在整个函数中保持不变。因此,y
结果中(append x y)
的内存地址仍然指向与之前相同的y
。对于x
,它没有。