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

在clojure中将函数作为参数传递,clojure,first-class-functions,Clojure,First Class Functions,我有一个函数,它接受一个函数和一个数字,并返回该函数在数字上的应用,还有一个立方体函数: (defn something [fn x] (fn x)) (defn cube [x] (* x x x)) 当我按如下方式调用函数时,它会工作: (something cube 4) 但这会返回一个错误: (something Math/sin 3.14) 然而,这是可行的: (something #(Math/sin %) 3.14) 原因是什么 Math.sin不是一个函数!它是

我有一个函数,它接受一个函数和一个数字,并返回该函数在数字上的应用,还有一个立方体函数:

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

(defn cube [x]
  (* x x x))
当我按如下方式调用函数时,它会工作:

(something cube 4)
但这会返回一个错误:

(something Math/sin 3.14)
然而,这是可行的:

(something #(Math/sin %) 3.14)

原因是什么

Math.sin
不是一个函数!它是一个直接来自Java的方法,不理解Clojure函数必须遵循的各种规则。如果将其封装在函数中,则该函数可以充当代理,将参数传递给“dumb”方法,并将结果返回到面向“smart”函数的上下文中。

谢谢,现在我明白了。事实上,当这种混乱出现时,我正试图理解宏。你能给我解释一下这句话吗?-'由于宏不计算其参数,因此可以向宏传递不带引号的函数名,并可以构造对带有参数的函数的调用。函数定义不能做到这一点,而必须传递匿名函数,这些匿名函数包装对函数的调用。“我的困惑是,我已经清楚地将一个无引号的函数“cube”传递给了“something”,并且它是有效的。你能不能把这个问题作为一个真正的SO问题而不是在注释中提出?这里的格式很平淡,我真的不想给一个完全不相关的问题添加“另一个答案”-