怎么设置!函数中对象的值?

时间:2019-05-06 03:41:39

标签: racket

我不明白为什么在空列表上使用称为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))

1 个答案:

答案 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) '())