【问题标题】:Is there a way to direectly loop over a Java Iterable in Kawa or alternatively loop on the java.util.Iterator有没有办法在 Kawa 中直接循环 Java Iterable,或者在 java.util.Iterator 上循环
【发布时间】:2019-06-03 14:51:20
【问题描述】:

我还没有找到在 Kawa (Scheme) 中使用 Java 互操作直接循环 Java java.lang.Iterable 或 java.util.Iterator 的方法

我可以访问我的 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,它将失败,因为我通过调用 next 来初始化块项而不首先检查 hasNext,它会不打印所有项目)但是这部分代码对于回答问题并不是必不可少的,并且可以修复(我现在时间不多了,但我明天会尝试更新代码)。
起点和基本代码是我获取 Iterable 和 Iterator 的前两行。

【问题讨论】:

    标签: java scheme lisp kawa


    【解决方案1】:

    看起来“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))
    

    【讨论】:

    • 是的,这就是解决方案。 Kawa 中的 Scheme 实现似乎将任何 java.lang.Iterable 作为序列处理。
    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2010-09-30
    • 2023-03-04
    • 1970-01-01
    • 2021-08-10
    相关资源
    最近更新 更多