Racket Добавление элементов в список
Здравствуйте учусь racket, делаю калькулятор. На основе идеологии префиксной нотации, интересно насколько это удобно. Делаю функцию памяти и тут затык: не совсем понимаю почему вот код
(define mem null) ; создание переменной памяти с пустым списком
>mem
'()
(define (memory x)(append mem (list x))) ; функция заполнения памяти
>(memory 10)
'(10)
>(memory 10)
'(10)
>mem
'()
Как видно добавления в переменную коя является списком не происходит видимо я что-то делаю не так
Ответы (2 шт):
(append ...) не меняет исходный список, а возвращает новый, поэтому при вызове (memory x) переменная mem остается неизменной.
Для изменения mem вам нужно воспользоваться функцией (set! id expr). Подробнее о ней можно почитать в документации.
Таким образом, объявление функции (memory x) будет выглядеть так:
(define (memory x) (set! mem (append mem (list x))))
при вызове функции (memory x) список mem не обновляется, поскольку append не изменяет исходный список, а создает новый список с добавленным элементом. Поэтому при повторном вызове функции (memory 10) и выводе значения переменной mem там остается пустой список.
Чтобы решить эту проблему, необходимо изменить функцию memory (x) так, чтобы она возвращала обновленный список, а затем обновляла значение переменной mem на этот список.