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*

最佳答案

你的问题不清楚。如果您的意思是:我可以在不使用堆栈空间的情况下执行此操作吗?不。你的 insertR* 有多个自调用,没有堆栈是不可能表达的。

如果您的意思是:我可以使用像 recur 这样的词来表示“递归调用自己”,并且我不在乎它是否使用堆栈?并不真地。不过你可以自己写。就像是:

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

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

我怀疑这有一些漏洞,但它基本上符合你的想法。

关于clojure - 在定义中自调用递归函数的通用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6032074/

10-10 01:04