Racket Добавление элементов в список

Рейтинг: 0Ответов: 2Опубликовано: 16.03.2023

Здравствуйте учусь racket, делаю калькулятор. На основе идеологии префиксной нотации, интересно насколько это удобно. Делаю функцию памяти и тут затык: не совсем понимаю почему вот код

(define mem null) ; создание переменной памяти с пустым списком
   >mem
   '()
(define (memory x)(append mem (list x))) ; функция заполнения памяти
  >(memory 10)
  '(10)
  >(memory 10)
  '(10)
  >mem
  '()

Как видно добавления в переменную коя является списком не происходит видимо я что-то делаю не так

Ответы

▲ 0

(append ...) не меняет исходный список, а возвращает новый, поэтому при вызове (memory x) переменная mem остается неизменной.

Для изменения mem вам нужно воспользоваться функцией (set! id expr). Подробнее о ней можно почитать в документации.

Таким образом, объявление функции (memory x) будет выглядеть так:

(define (memory x) (set! mem (append mem (list x)))) 
▲ 0

при вызове функции (memory x) список mem не обновляется, поскольку append не изменяет исходный список, а создает новый список с добавленным элементом. Поэтому при повторном вызове функции (memory 10) и выводе значения переменной mem там остается пустой список.

Чтобы решить эту проблему, необходимо изменить функцию memory (x) так, чтобы она возвращала обновленный список, а затем обновляла значение переменной mem на этот список.