Clojure 用于在定义中自调用递归函数的泛型函数

Clojure 用于在定义中自调用递归函数的泛型函数,clojure,Clojure,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))))

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*

为什么需要这种函数/宏? recur是为尾部调用优化而创建的。看来你的函数不允许(可能是我错了)。虽然你说你不需要它。为什么要将调用insertR*显式替换为其他内容?
如果您不喜欢每次传递newkey-oldkey(并且它们没有更改),您可以创建内部函数,该函数将使用这些键。

您的问题不清楚。如果您的意思是:我可以不使用堆栈空间来执行此操作吗?不可以。您的
insertR*
有多个self调用,没有堆栈就无法表达

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

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

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

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

这样我就可以在IDE上使用泛型关键字突出显示递归调用