Есть ли способ прямого цикла над Java Iterable в Kawa или альтернативного цикла на java.util.Iterator - PullRequest
0 голосов
/ 09 января 2019

Я не нашел способа напрямую зацикливаться на Java java.lang.Iterable или java.util.Iterator в Kawa (схема) с использованием взаимодействия Java

Я могу получить на своем Java java.lang.Iterable, а затем на java.util.Iterator и перебрать элементы, используя рекурсив с именем let:

((define blkaccessor::java.lang.Iterable (bfaccessor:getHeaderAccessor))
(define blkaccitr::java.util.Iterator (blkaccessor:iterator))
(let        loop    ((block-item::JDataBlockItemData (blkaccitr:next)))
             (when (blkaccitr:hasNext)
                (display &{&[block-item:name] = &[block-item:value]
})
                (loop (blkaccitr:next))
            )
)

Код запускается и перечисляет все элементы в REPL, но должен быть способ выполнить прямой цикл на Iterable или Итераторе.

ПРИМЕЧАНИЕ: я только что понял, что мое рекурсивное "let" ужасно неверно (произойдет сбой, если метод итератора hasNext вернет false при входе, потому что я инициализирую block-item, вызывая next без предварительной проверки hasNext, и он будет не печатать все элементы), но эта часть кода не обязательна для ответа на вопрос, и ее можно исправить (сейчас у меня заканчивается время, но я попытаюсь обновить код завтра).
Начальная точка и необходимый код - это первые две строки, где я получаю свой Iterable, а затем мой Iterator.

1 Ответ

0 голосов
/ 09 января 2019

Похоже, что "map" и "for-each" должны иметь возможность перебирать итераторы: https://gitlab.com/kashell/Kawa/commit/9428041dca2d262edc3a5ab781e1302f33e279a1

Ваш код не может быть воспроизведен без более подробной (или меньшей) детали, но ниже приведен пример итерации по массиву строк Java:

(let ((java-string-array (String[] "aaa" "bb" "c")))
  (for-each (lambda (string) (write string))
            java-string-array))
...