Когда на практике следует использовать letfn vs. let для определения локальных функций? Как насчет случаев, когда мне нужны как локальные функции, так и локальные не-функции?let vs letfn для определения локальных функций в clojure?
ответ
Если мне нужна только локальная функция или 2 ... или 3 ... Я позволю им. Если мне нужно позволить сочетание функций и не-функций, я просто использую нормальный let. letfning и letting будет очень многословным способом сделать это.
Однако, если вам нужна взаимная рекурсия через ваши локальные функции, вам придётся разрешить их в любом случае.
Краткая версия: используйте их, если считаете, что это выглядит лучше, и когда это удобно. Нет никаких жестких и быстрых правил для использования. Это всего лишь инструменты инструментария Clojure.
Удачи!
Обычно это проще и аккуратнее использовать let
: таким образом вы можете определить набор обеих функций и не-функций в одной форме, и даже отсылают к предыдущим определениям:
(let [f (fn [x] ....)
value (reduce f some-collection)
foo bar]
.....)
letfn
действительно требуется только тогда, когда вы хотите определить несколько функций, которые рекурсивно ссылаются друг на друга. let
не будет работать в этом случае, потому что он не поддерживает рекурсивные ссылки.
- 1. Единичное тестирование локальных функций (letfn) в Clojure?
- 2. Определения функций в Clojure
- 3. Let vs. Binding in Clojure
- 4. Когда использовать let vs. if-let in Clojure
- 5. Clojure: Развернуть var в let binding
- 6. Clojure: ярлык для if-let
- 7. «MyFunc»: определения локальных функций являются незаконными
- 8. Лучшая практика Clojure для вложенных let
- 9. Как создать макрос для определения двух функций в clojure
- 10. Преимущества определения над let
- 11. Определить рекурсивную функцию в форме let
- 12. clojure когда-let альтернатива для пустого массива?
- 13. Использование var вне let-clojure
- 14. clojure - разрешить символ внутри let
- 15. Confused by «let» in Clojure
- 16. Проблемы с дифференциацией Rspec 'let' vs 'let!'
- 17. Regex для определения функций C#
- 18. let vs var performance
- 19. Lazy Var vs Let
- 20. Есть ли идиоматический способ высушить аналогичные определения функций в clojure?
- 21. Определения функций для интерфейсов
- 22. Охрана vs if-let
- 23. `обеспечивать` функцию в clojure misbehaves внутри` let`?
- 24. Соответствующие параметры с let/fn в Clojure
- 25. Clojure: синтаксис документации, касающийся when-let и if-let
- 26. Clojure Type Hints для функций высокого порядка
- 27. let vs let * в LISP - есть ли разница в эффективности?
- 28. Вызов локальных функций в node.js
- 29. определения функций в Haskell интерактивные
- 30. Передача локальных функций в setTimeout()
Обратите внимание, что даже для простой рекурсии (функция, использующая тело) требуется letfn. – fmjrey
Функция может ссылаться на себя следующим образом: '(fn foo [x] .... (foo ...) ...)' – mikera
Да, действительно! Хотя в форме let, означающей наличие двух имен для одного и того же fn (одно имя в let binding, другое в fn-форме) или повторение одного и того же имени дважды, поэтому letfn может быть лучше. – fmjrey