【问题标题】:Macros and functions in ClojureClojure 中的宏和函数
【发布时间】:2011-08-09 08:00:15
【问题描述】:

我在这个 Clojure 教程中阅读了以下行 - http://java.ociweb.com/mark/clojure/article.html#Macros

'由于宏不评估其参数,因此可以将不带引号的函数名称传递给它们,并且可以构造对带参数的函数的调用。函数定义不能做到这一点,而是必须传递匿名函数来包装对函数的调用。

如果它是正确的,那么为什么这会起作用,因为函数立方体不是匿名的-

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

(defn cube [x]
  (* x x x))

(something cube 4)

【问题讨论】:

  • 您将函数 cube 传递给 something,而不仅仅是其名称。

标签: function macros clojure


【解决方案1】:

你说得对,那句话似乎不正确。我认为它想说的是你不能将看起来像函数调用的东西传递给未引用的函数:

(some-function (bla 1 2 3))

在这种情况下,(bla 1 2 3) 将被评估为函数调用,并将返回值传递给 some-function。

(some-macro (bla 1 2 3))

在宏的情况下,传递的是 list (bla 1 2 3),然后可以通过插入参数来构造一个新的函数调用,或者做其他事情。

您绝对仍然可以将一个函数传递给另一个函数,正如您所展示的那样,这是一个完整的文档和预期的技术。

【讨论】:

    【解决方案2】:

    defn 是 s 宏,代码扩展为,因为你需要匿名函数:(def something (fn [fn x] (fn x)))。我想他指的是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多