2011-05-07 51 views

回答

1

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中並不那麼流利。

+0

感謝您的解釋,但如果您有一個可以調用的fn對象,那麼如何在純java中解決此問題。 – 2011-05-07 20:59:07

+0

@ hamza-yerlikaya這就是Java代碼的功能。另請參閱編輯。 – kotarak 2011-05-08 12:20:11