在clojure中将函数作为参数传递

Pra*_*nav 6 clojure first-class-functions

我有一个函数,它接受一个函数和一个数字,并返回函数的数字应用程序和一个立方体函数:

(defn something [fn x]
  (fn x))

(defn cube [x]
  (* x x x))
Run Code Online (Sandbox Code Playgroud)

当我按如下方式调用该函数时,它可以工作:

(something cube 4)
Run Code Online (Sandbox Code Playgroud)

但是这会返回一个错误:

(something Math/sin 3.14)
Run Code Online (Sandbox Code Playgroud)

但是,这有效:

(something #(Math/sin %) 3.14)
Run Code Online (Sandbox Code Playgroud)

解释是什么?

ama*_*loy 14

Math.sin不是功能!它是一种直接来自Java的方法,并不理解Clojure函数必须遵循的各种规则.如果将它包装在函数中,那么该函数可以充当代理,将参数传递给"哑"方法并将结果返回到"智能"面向函数的上下文.