我不明白你的整个目标:你使用的很多术语都是模糊的。就像,你想要评估一系列函数然后重复他们的结果是什么意思?这些函数必须是无参数函数(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