2011-05-17 123 views
4

Clojure中是否有阅读器宏或核心函数,与recur类似,但可能使用非尾部位置?用于自定义递归函数的通用函数定义

例如,在这个递归函数

(defn insertR* [newkey oldkey l] 
    (cond 
    (empty? l) '() 
    (not (seq? (first l))) 
     (if (= (first l) oldkey) 
     (cons oldkey (cons newkey (insertR* newkey oldkey (rest l)))) 
     (cons (first l) (insertR* newkey oldkey (rest l))))  
    :else 
     (cons (insertR* newkey oldkey (first l)) (insertR* newkey oldkey (rest l))))) 

有一些通用的功能,我可以用它来调用本身,而不是调用insertR*明确?

回答

3

你的问题还不清楚。如果你的意思是:我可以做到这一点,而不使用堆栈空间?不可以。您的insertR*有多个自己的电话,这是不可能没有堆栈表达。

如果你的意思是:我可以用一个像recur这样的词来表示“自己调用你自己”,我不关心它是否使用堆栈?不是真的。不过,你可以自己写。像这样:

(defmacro defrec [name & fntail] 
    `(def ~name (fn ~'recurse [email protected]))) 

(defrec foo [x] 
    (when-not (zero? x) 
    (recurse (dec x)))) 

我怀疑这有几个漏洞,但它基本上是你在想什么。

+0

突出显示递归调用。我的意思是后者。 – 2011-05-17 17:40:36

0

为什么你需要这种功能/宏? recur被创建用于尾部呼叫优化。看来你的功能不允许它(可能是我错了)。虽然你说你不需要它。你为什么要将你的调用insertR *明确地替换为别的? 如果你不喜欢每次都传递newkey oldkey(并且它们没有改变),你可以创建内部函数,它将使用这个键。

+0

就这样,我可以在我的IDE上使用通用关键字 – 2011-05-17 17:44:59