2011-04-20 179 views
5

我有一个函数,它接受一个函数和一个数,并返回对数的函数的应用,以及一个立方体功能:传递函数作为参数用Clojure

(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) 

什么是解释?

回答

13

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

+0

谢谢,现在我明白了。实际上,当这种混乱发生时,我试图理解宏。你能向我解释这一行吗? - '由于宏不评估它们的参数,可以将未加引号的函数名称传递给它们,并且可以构造具有参数的函数调用。函数定义不能做到这一点,而是必须传递匿名函数,将函数调用到函数中。 – Pranav 2011-04-20 06:56:10

+0

我的困惑是,我已经明确地将一个没有引号的函数'cube'传递给'something',并且工作正常。 – Pranav 2011-04-20 06:59:26

+1

你可以问这是一个真正的问题,而不是在评论中?这里的格式非常暗淡,我不想为完全不相关的问题添加“另一个答案”。 – amalloy 2011-04-20 07:38:39