Когда на практике следует использовать letfn vs. let для определения локальных функций? Как насчет случаев, когда мне нужны как локальные функции, так и локальные не-функции?
Пусть vs letfn для определения локальных функций в clojure?
Ответ 1
Если мне нужна только локальная функция или 2... или 3... я позволю им. Если мне нужно позволить сочетание функций и не-функций, я просто использую нормальный let. letfning и letting будет очень многословным способом сделать это.
Однако, если вам нужна взаимная рекурсия через ваши локальные функции, вам нужно будет разрешить их в любом случае.
Краткая версия: используйте их, если считаете, что это выглядит лучше, и когда это удобно. Нет никаких жестких и быстрых правил для использования. Это всего лишь инструменты в панели инструментов Clojure.
Удачи!
Ответ 2
Обычно проще и удобнее использовать let
: таким образом вы можете определить набор как функций, так и не-функций в одной форме и даже ссылаться на предыдущие определения:
(let [f (fn [x] ....)
value (reduce f some-collection)
foo bar]
.....)
letfn
действительно требуется только тогда, когда вы хотите определить несколько функций, которые рекурсивно ссылаются друг на друга. let
не будет работать в этом случае, потому что он не поддерживает рекурсивные ссылки.