Nano Hash - криптовалюты, майнинг, программирование

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 и не могу найти способ изменить (или добавить) элемент.

Спасибо,

Крис

17.01.2014

  • Вы можете обращаться с ним как с итерируемой коллекцией. 17.01.2014
  • LazySeq и PersistentHashMap являются неизменяемыми — по сути, вам нужно создать новую последовательность на основе содержимого той, которую вы передали. Это будет нетривиальный объем работы, чтобы сделать это на Java. 17.01.2014
  • @Alex Это тривиально, например. превратить его в ArrayList (конструктор ArrayList принимает коллекцию), изменить ArrayList по желанию и предоставить обратно ArrayList, предполагая, что принимающему коду Clojure нужна только коллекция. 17.01.2014
  • @A.Webb True, и вы также можете использовать конструктор копирования HashMap для изменения карт в последовательности. Но большая часть идиоматического кода Clojure сломается, если получит необработанные карты там, где ожидает постоянную карту; не зная больше о коде Clojure, я бы не стал делать никаких подобных предположений. 17.01.2014
  • @Алекс Верно. Я больше думал об изменении коллекции, чем о содержимом коллекции. В качестве альтернативы используйте clojure.lang.RT для выполнения работы. 18.01.2014
  • Я думаю, что четкий путь - получить элементы ленивой последовательности и вызвать конструктор LazySeq для измененных элементов. Точно так же, что касается измененных элементов, сделайте это, заменив их новым элементом, возвращенным путем связывания/обновления предыдущего элемента (должен быть метод PersistentHashMap, который принимает новый ключ /val и возвращает новый PersistentHashMap с этим ключом/ добавлен Вал). Я бы сделал это ответом, но я не знаю специфики API со стороны Java. 18.01.2014
  • Или напишите бит между шагами 1 и 2 как функцию в Clojure, скомпилируйте его и импортируйте в Java. 23.01.2014

Ответы:


1

Короткий ответ: вы не можете. LazySeq и PersistentHashMap в Clojure неизменяемы.

Подробный ответ: Как правило, код Clojure делает очень мало предположений о точном типе объекта списка, который он получает. Большинство вещей работает против ISeq, который, если вы не хотите возиться с другими типами Clojure, довольно тривиально реализовать.

Итак, вам нужно создать класс, который реализует ISeq и возвращает преобразованные PersistentHashMap, когда он проходит через своего родителя LazySeq. Вместо этого создайте экземпляр этого класса и передайте его clojureFunctionReceivingLazySeq(seq).

18.03.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..