2009-07-29 5 views

ответ

37

Если мне нужна только локальная функция или 2 ... или 3 ... Я позволю им. Если мне нужно позволить сочетание функций и не-функций, я просто использую нормальный let. letfning и letting будет очень многословным способом сделать это.

Однако, если вам нужна взаимная рекурсия через ваши локальные функции, вам придётся разрешить их в любом случае.

Краткая версия: используйте их, если считаете, что это выглядит лучше, и когда это удобно. Нет никаких жестких и быстрых правил для использования. Это всего лишь инструменты инструментария Clojure.

Удачи!

18

Обычно это проще и аккуратнее использовать let: таким образом вы можете определить набор обеих функций и не-функций в одной форме, и даже отсылают к предыдущим определениям:

(let [f  (fn [x] ....) 
     value (reduce f some-collection) 
     foo bar] 
    .....) 

letfn действительно требуется только тогда, когда вы хотите определить несколько функций, которые рекурсивно ссылаются друг на друга. let не будет работать в этом случае, потому что он не поддерживает рекурсивные ссылки.

+0

Обратите внимание, что даже для простой рекурсии (функция, использующая тело) требуется letfn. – fmjrey

+3

Функция может ссылаться на себя следующим образом: '(fn foo [x] .... (foo ...) ...)' – mikera

+0

Да, действительно! Хотя в форме let, означающей наличие двух имен для одного и того же fn (одно имя в let binding, другое в fn-форме) или повторение одного и того же имени дважды, поэтому letfn может быть лучше. – fmjrey

Смежные вопросы