学习 Clojure:一式三份上的 NullPointerException

ste*_*ino 3 clojure

我正在学习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)

原因可能是什么?

Ala*_*son 5

恕我直言,最明确的解决方案是:

(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来查找它的定义。