我正在学习Clojure 官方网站上的初学者教程。
一项练习要求您执行以下操作:
7) 定义一个函数
triplicate,它接受另一个函数并调用它三次,不带任何参数。
我解决如下:
(defn triplicate [f] ((f) (f) (f)))
Run Code Online (Sandbox Code Playgroud)
问题是,使用时,最后NullPointerException会抛出 a ,我无法确定原因。
user=> (triplicate #(println "hello, world"))
hello, world
hello, world
hello, world
NullPointerException user/triplicate (NO_SOURCE_FILE:115)
Run Code Online (Sandbox Code Playgroud)
以下是 的输出pst,如果有用的话:
user=> (pst)
NullPointerException
user/triplicate (NO_SOURCE_FILE:145)
user/triplicate (NO_SOURCE_FILE:145)
user/eval376 (NO_SOURCE_FILE:146)
user/eval376 (NO_SOURCE_FILE:146)
clojure.lang.Compiler.eval (Compiler.java:7062)
clojure.lang.Compiler.eval (Compiler.java:7025)
clojure.core/eval (core.clj:3206)
clojure.core/eval (core.clj:3202)
clojure.main/repl/read-eval-print--8572/fn--8575 (main.clj:243)
clojure.main/repl/read-eval-print--8572 (main.clj:243)
clojure.main/repl/fn--8581 (main.clj:261)
clojure.main/repl (main.clj:261)
nil
Run Code Online (Sandbox Code Playgroud)
原因可能是什么?
恕我直言,最明确的解决方案是:
(do
(f)
(f)
(f))
Run Code Online (Sandbox Code Playgroud)
评估多个表达式是 的唯一目的do。如果您不想重复剪切和粘贴,最好的方法是:
(dotimes [i 3]
(f))
Run Code Online (Sandbox Code Playgroud)
使用向量形式会稍微模糊重复目标,并意味着您需要 3 的返回值(f)。
脚注:我永远不会使用它,juxt因为它是一个晦涩的函数,会让大多数人摸不着头脑,跑到Clojure CheatSheet来查找它的定义。