的lazy-seq
宏的主體放入一個函數。當使用身體產生的序列時,它只是調用該函數來執行身體。你可以 - 或多或少 - 通過以下重新實現lazy-seq
:
(defn simple-lazy-seq*
[seq-producing-fn]
(reify
clojure.lang.Sequential
clojure.lang.Seqable
(seq [this] (seq (seq-producing-fn)))))
(defmacro simple-lazy-seq
[& body]
`(simple-lazy-seq* (fn [] [email protected])))
從核心的lazy-seq
還提供了ISeq
接口,但這不是絕對必要的。
編輯:在純Java中做事情。
static Seqable lazy_seq(IFn seq_generating_fn) {
return new Seqable() {
ISeq seq() {
return RT.seq(seq_generating_fn.invoke());
}
}
}
YourClass.lazy_seq(new IFn() {
Object invoke() {
return thing.returning_the_seq();
}
});
我不知道我的語法細節是否正確,但它應該很接近。如你所見,這裏有一些限制。例如。 thing
必須是final
IIRC。但我在Java中並不那麼流利。
感謝您的解釋,但如果您有一個可以調用的fn對象,那麼如何在純java中解決此問題。 – 2011-05-07 20:59:07
@ hamza-yerlikaya這就是Java代碼的功能。另請參閱編輯。 – kotarak 2011-05-08 12:20:11