【问题标题】:passing functions as arguments in clojure在 clojure 中将函数作为参数传递
【发布时间】:2011-04-20 06:26:36
【问题描述】:

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

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

解释是什么?

【问题讨论】:

    标签: clojure first-class-functions


    【解决方案1】:

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

    【讨论】:

    • 谢谢,现在我明白了。实际上,当出现这种混淆时,我正试图理解宏。你能给我解释一下这条线吗? - '由于宏不评估它们的参数,所以可以将不带引号的函数名传递给它们,并且可以构造对带参数的函数的调用。函数定义不能这样做,而是必须传递匿名函数来包装函数调用。'
    • 我的困惑是我已经清楚地将一个未引用的函数 'cube' 传递给了 'something' 并且有效。
    • 您能否将其作为一个真正的 SO 问题而不是在 cmets 中提出?这里的格式相当乏味,我真的不想在一个完全不相关的问题上添加“另一个答案”。
    • 在这里发布了一个新问题 - stackoverflow.com/questions/5727923/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2023-04-02
    • 2011-02-13
    • 2013-08-25
    相关资源
    最近更新 更多