Как говорит ошибка, вы пытаетесь выполнить итерацию функции. Это происходит потому, что когда вы пишете:
(alter people filter #(not= (:name %) name-to-delete))
Развернутый people
становится аргументом first для filter
, а не последним.
Вам нужно будет использовать полный fn
или partial
:
(alter people
(fn [ps] (filter #(not= (:name %) name-to-delete) ps)))
Или
(alter people
(partial filter #(not= (:name %) name-to-delete)))
Они заставляют alter
передавать развернутый people
в качестве последнего аргумента filter
, а не неявно в качестве первого.
Я отмечу, хотя:
Как упоминалось в комментариях @cfrick, использование ленивых последовательностей в транзакции может потенциально вызывать проблемы. Я не могу придумать сценарий, где это произойдет, но он чувствует неправильным. Можно утверждать, что реализация отложенной последовательности является побочным эффектом, и побочные эффекты не должны иметь место в транзакции, поскольку транзакции могут выполняться несколько раз в случае конфликта. Многочисленные реализации не должны вызывать проблемы, но я не могу однозначно сказать, что это безопасно (честно говоря, я никогда не использую ref
s).
Убедитесь, что вам действительно нужны ref
s и транзакции здесь. Транзакции предназначены для тех случаев, когда вам нужно упорядочить несколько изменений данных и иметь возможность отследить, когда соответствующие данные были изменены в процессе транзакции. Если вам просто нужен простой изменяемый контейнер, atom
намного проще.