【问题标题】:How might I write a "defn" macro in Clojure?如何在 Clojure 中编写“defn”宏?
【发布时间】:2010-11-14 00:21:37
【问题描述】:

我正在练习编写宏,但我似乎无法让 defn 工作。

我的语法是:(my-define name parameter body)

忽略 & 参数和递归例程,如何将名称绑定到 (fn[parameter] body)?

【问题讨论】:

  • 您可以使用macroexpand 在repl 中查看宏扩展为什么。例如。 (macroexpand '(defn foo [] 1))。这在调试您自己的宏以及尝试从 clojure/core 宏中学习时都很有用。
  • 也可以使用(source defn)直接检查源代码。

标签: macros clojure


【解决方案1】:

你需要转型

(my-define <name> <args> <body>)

(def <name> (fn <args> <body>))

其实这很简单:

(defmacro my-define [name args body]
  `(def ~name (fn ~args ~body)))

【讨论】:

  • 这不利于正文中具有多种形式的函数,也不利于文档字符串。
  • 对于多个表单使用拼接运算符 (@) -> ~@body
猜你喜欢
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 2018-05-23
  • 1970-01-01
  • 2018-11-21
相关资源
最近更新 更多