【发布时间】:2023-03-28 20:59:01
【问题描述】:
我正在尝试将词性函数的输出通过管道传输到索引词函数中,并使用 (->) 线程宏打印结果输出:
(defn parts-of-speech []
(seq (. POS values)))
(defn index-words [pos]
(iterator-seq (. dict getIndexWordIterator pos)))
(-> (parts-of-speech) index-words println)
但是 index-words 函数返回一个迭代器序列,我不确定如何在这种情况下迭代它,因为我是 Clojure 的新手。
编辑:根据建议更新代码。
更新:
感谢@kotarak 和@jayunit100 的回答以及@sw1nn 和@marko-topolnik 的cmets,我至少有两种变体:
(->> (parts-of-speech) (map index-words) (map println) doall)
(doseq [w (map index-words (parts-of-speech))]
(println w))
我来自命令式背景,我对这个问题的目标是理解线程宏以尝试编写更惯用的 Clojure(在尝试使用线程宏之前,我使用多个 @987654324 循环遍历每个序列@ 和 lets)。
从 cmets 看来,线程宏可能不是最惯用的方法,但我仍然想看看如何使它工作,以便填补这一理解空白。
另外,(parts-of-speech) 返回一个由四个项目组成的序列,如果您执行 (println (count w)) 而不是 (println w),您可以看到它打印四个序列的计数而不是一个连续序列:
(doseq [w (map index-words (parts-of-speech))]
(println (count w)))
;= 117798
;= 11529
;= 21479
;= 4481
您将如何修改上述内容以打印一个连续的单词流而不是打印四个序列的内容?
顺便说一句:上面的代码包装了 MIT Java WordNet 库 (http://projects.csail.mit.edu/jwi/)。
【问题讨论】:
-
您的问题还没有解决吗?这看起来像正确的代码。它不打印序列吗?要在下面回答您的评论:在 clojure 中,您不使用迭代器。使用
doseq实现序列迭代。所以如果你愿意,你可以说(doseq [w (index-words (parts-of-speech)] (println w))。 -
BTW 遍历原生 Java 数组与遍历 clojure 中的任何其他内容相同——即所有 seqable 内容。
标签: java clojure iterator sequence