Как установить! значение объекта в функции? - PullRequest
1 голос
/ 06 мая 2019

Я не понимаю, почему, когда я использую эту функцию, называемую 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 Ответ

2 голосов
/ 06 мая 2019

Причина довольно проста: в первом примере кода вы переназначаете процедуру параметр ( локальная ссылка на список) на новое значение, кроме списка " снаружи "все еще указывает на исходное значение, и когда процедура завершается, эта ссылка остается неизменной.

Если вы хотите изменить список «снаружи», вам нужно изменить ссылку на этот список, а не на параметр. Просто знайте, что это не функциональное программирование, и в 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) '())
...