Можно ли определить две функции в clojure, которые рекурсивно называют друг друга? Например, эта пара:Две функции, которые называют друг друга рекурсивно
(defn a [x]
(if (= 0 x) 0 (b (dec x))))
(defn b [x]
(if (= 0 x) 0 (a (dec x))))
Компиляция завершается с:
Unable to resolve symbol: b in this context
Поскольку я не определен b
, когда я пытаюсь вызвать его в a
.
например, рубина это работает отлично:
def a(x)
x == 0 ? x : b(x-1)
end
def b(x)
x == 0 ? x : a(x-1)
end
Понятно, что есть компромисс для скорости компиляции, который он не может смотреть вперед для определения функций. Благодаря удаленному ответу для этой ссылки на документы (http://clojuredocs.org/clojure_core/clojure.core/declare) – spike
Компромисс не для скорости компиляции, а для обнаружения ошибок. Существует также функция 'resolve', когда два пространства имен должны взаимно ссылаться друг на друга. – noisesmith
У вас есть ссылка для получения дополнительной информации об этом? Какие ошибки избегают компилятор, игнорируя явные определения функций? – spike