4

私は 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 で期待する引数の数は何ですか? 、しかし多分そうであり、私はそれを認識する経験を持っていません.

(literal-14)呼び出しが機能するようにするには、literal-14 を定義する方法、または定義できますか?

4

2 に答える 2

11

A. Webb が指摘したように、constantlyこれを記述する最も慣用的な方法は次のとおりです。

(def fourteen (constantly 14))

無名関数リテラルの問題は、常に本体がリストである関数に展開されることです。

'#(stuff and things) ;=> (fn* [] (stuff and things))

だから、あなたの試みで何が起こっているのですか:

'#(14) ;=> (fn* [] (14))

これらの括弧を取り除く方法はありません。doまたはまたはそのようなものを使用してそれらをハックすることもできますがidentity、要点は、本体がリストとして記述されるのに適していない無名関数を記述する必要がある場合は、リテラル構文を使用しないでください。

于 2016-03-02T03:16:54.267 に答える
6

14関数ではありませんが、ピンチで行うdoか:->

#(do 14)
#(-> 14)
于 2016-03-02T02:14:44.113 に答える