существует также форма letfn
для (возможно) взаимно рекурсивных функций:
user=> (letfn [(f1 [x] (if (< x 10) (f2 x) x))
(f2 [x] (f1 (inc x)))]
(f2 0))
;;=> 10
обновление если вам нужны эти функции глобально, вы всегда можете использовать def
внутри letfn
.Что касается меня, я считаю, что этот подход немного чище, чем declare
(особенно для взаимно рекурсивных):
user> (letfn [(f1 [x] (if (< x 10) (f2 x) x))
(f2 [x] (f1 (inc x)))]
(def f1 f1)
(def f2 f2))
#'user/f2
user> (f2 0)
;;=> 10