我不明白为什么在空列表上使用称为m-add的函数时,列表保持不变。当我复制带有参数的确切功能集中时,列表将更改。为什么它在函数中不起作用?
(define (m-add x v m)
(set! m (cons (mcons x v) m)))
```with for example this
> (define n null)
> (m-add 'q 3 n)
```result:
> n
'()
``but this:
> (set! n (cons (mcons 'q 3) n))
``gives result:
> n
(list (mcons 'q 3))
答案 0 :(得分:2)
原因很简单:在第一个示例代码中,您将过程参数(对列表的 local 引用)重新分配给新值,但是列表“外部”仍然指向原始值,并且当该过程退出时,该引用保持不变。
如果要在“外部”修改列表,则需要修改对该列表的引用,而不是对参数的引用。请注意,这不是函数式编程,在Scheme中,我们通常不会执行以下操作:
(define lst null)
(define (m-add x v)
(set! lst (mcons (mcons x v) lst)))
(m-add 'q 3)
lst
=> (mcons (mcons 'q 3) '())