Я начинаю изучать clojure, и я наткнулся на следующее, когда я обнаружил, что объявляю функцию «сумма» (в учебных целях), я написал следующий код
(def sum (fn [& args] (apply + args)))
Я понял, что я определил символьную сумму как содержащую этот fn, но почему я должен заключать Fn в круглые скобки, разве компилятор не вызывает эту функцию при определении, а не когда кто-то фактически ее вызывает? Может быть, это просто мой императивный мозг.
Кроме того, каковы случаи использования let
? Иногда я натыкаюсь на код, который его использует, и другой код, который этого не делает, например, на сайте Clojure, где есть упражнение по использованию функции OpenStream из Java Interop, я написал следующий код:
(defn http-get
[url]
(let [url-obj (java.net.URL. url)]
(slurp (.openStream url-obj))))
(http-get "https://www.google.com")
в то время как они написали следующее на сайте clojure в качестве ответа
(defn http-get [url]
(slurp
(.openStream
(java.net.URL. url))))
Опять же, возможно, это просто мой императивный мозг, говорящий о необходимости наличия «переменной» или «объекта» для хранения чего-либо перед использованием это, но я совершенно не понимаю, когда я должен использовать let
или когда я не должен.