Как сделать буквальную функцию, которая не принимает аргументов и возвращает постоянное значение?
Я пытаюсь выучить Clojure, и я заблокирован синтаксисом буквальной функции. Я не могу понять, что буквальный эквивалент функции (defn fourteen [] 14)
является.
(def fourteen (fn [] 14))
;; => #'user/fourteen
(fourteen)
;; => 14
(defn defn-fourteen [] 14)
;; => #'user/defn-fourteen
(defn-fourteen)
;; => 14
(def literal-14 #(14))
;; => #'user/literal-14
(literal-14)
;; ClassCastException java.lang.Long cannot be cast to clojure.lang.IFn user/literal-14 (form-init2956929406616221071.clj:1)
Я не думаю, что это дуплекс Сколько аргументов ожидает анонимная функция в clojure?, но, возможно, это так, и у меня просто нет опыта, чтобы признать это.
Как, или может, я определяю буквально-14, чтобы позволить (literal-14)
призыв к работе?
2 ответа
14
не функция, но do
или же ->
будем делать в крайнем случае:
#(do 14)
#(-> 14)
Как отметил А. Вебб, constantly
это самый идиоматический способ написать это:
(def fourteen (constantly 14))
Проблема с литералом анонимной функции заключается в том, что он всегда расширяется до функции, тело которой представляет собой список:
'#(stuff and things) ;=> (fn* [] (stuff and things))
Итак, вот что происходит в вашей попытке:
'#(14) ;=> (fn* [] (14))
Нет способа избавиться от этих скобок. Вы можете взломать их, используя do
или же identity
или что-то в этом роде, но суть в том, что если вам нужно написать анонимную функцию, тело которой не подходит для записи в виде списка, вы не должны использовать буквальный синтаксис.