Это связано с тем, что средство обновления должно быть функцией, которая принимает значение в качестве входных данных и производит новое значение на выходе. Поскольку набор является изменяемым, и вы используете set-add!
для его изменения, «средство обновления» не возвращает новое значение, а просто изменяет старое и создает пустоту.
Есть два способа исправить это:
- Изменяемые наборы как значения, изменять их отдельно, а не внутри
hash-update!
. - Неизменяемые наборы как значения, используйте функциональное средство обновления внутри
hash-update!
.
Поскольку вы указали, что хотите, чтобы значения были изменяемыми наборами, я покажу (1).
Самый простой c вы можете сделать это hash-ref
, чтобы получить изменяемый набор, а затем использовать set-add!
на этом.
(set-add! (hash-ref hash key) new-val)
Однако, это не работает, если для этого ключа еще нет изменяемого значения. Его нужно добавить в таблицу, если он еще не существует, поэтому у вас есть аргумент (mutable-set 1)
результат сбоя. Решение не hash-update!
, это hash-ref!
.
(set-add! (hash-ref! hash key (mutable-set 1)) new-val)
Хотя, вероятно, было бы лучше, если бы вы обернули результат отказа в преобразователе
(set-add! (hash-ref! hash key (λ () (mutable-set 1))) new-val)