我不明白你的整個目標:你使用的很多術語都是模糊的。就像,你想要評估一系列函數然後重複他們的結果是什麼意思?這些函數必須是無參數函數(thunk),那麼,我想呢?但有一個thunk首先返回x,然後在你下次調用它時返回y,這是相當邪惡和有狀態的。也許trampoline將解決你的問題的一部分?
你也鏈接到你想避免的東西,但似乎粘貼了錯誤的鏈接 - 它只是一個鏈接回到這個頁面。如果你想避免堆棧溢出,那麼蹦牀很可能是一個好方法,儘管循環/重複應該是可能的。除非返回y,否則thunk返回x的這個概念是瘋狂,如果避免堆棧溢出是您的主要目標。不要那樣做。
我已經先行一步,在你可能有最合理的最終目標邁出了猜測,這是我的實現:
(defn call-until-number [& fs]
(let [numeric (fn [x] (when (number? x) x))]
(loop [fs fs]
(let [result (map #(%) fs)]
(or (some numeric result)
(recur result))))))
(call-until-number (fn [] (fn [] 1))) ; yields 1
(call-until-number (fn [] (fn [] 1)) ; yields 2
(fn [] 2))
(call-until-number (fn f [] f)) ; never returns, no overflow
謝謝你們,看起來像蹦牀可能是我需要的東西 – gone 2011-03-21 05:58:01