Как сделать буквальную функцию, которая не принимает аргументов и возвращает постоянное значение?

Я пытаюсь выучить 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 или что-то в этом роде, но суть в том, что если вам нужно написать анонимную функцию, тело которой не подходит для записи в виде списка, вы не должны использовать буквальный синтаксис.

Другие вопросы по тегам