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) вместо.

Другие вопросы по тегам