Clojure изменить LazySeq
Я унаследовал некоторый код Java, который делает следующее:
1) он получает от Clojure объект LazySeq (который состоит из нескольких объектов PersistentHashMap)
2) затем он передает тот же самый объект LazySeq (без изменений) обратно в скрипт Clojure, где он преобразуется в строку и передается обратно в Java
Проблема заключается в том, что в коде Java после шага (1) и до шага (2) мне нужно изменить некоторые объекты PersistentHashMap внутри LazySeq, а затем перейти к шагу (2). Что-то вроде:
LazySeq seq = clojureFunctionReturningLazySeq();
//update the elements of the sequence
String result = clojureFunctionReceivingLazySeq(seq);
Я не могу изменить сам скрипт Clojure, и обновление LazySeq должно происходить внутри кода Java. Я проверил LazySeq API и не могу найти метод для изменения (или добавления) элемента.
Спасибо,
Крис
1 ответ
Краткий ответ: вы не можете. LazySeq
а также PersistentHashMap
в Clojure неизменны.
Более длинный ответ: как правило, код Clojure делает очень мало предположений о точном виде объекта списка, который он получает - большинство вещей работает против ISeq
что, если вы не хотите беспокоиться о других типах Clojure, довольно просто реализовать.
Итак, вам нужно создать класс, который реализует ISeq
и возвращается преобразуется PersistentHashMap
как он проходит через своего родителя LazySeq
, Создайте этот класс и передайте его clojureFunctionReceivingLazySeq(seq)
вместо.