macros - 如何创建一个宏来在 clojure 中定义两个函数

标签 macros lisp clojure

下面的代码并不像我预期的那样运行。

; given a function name, its args and body, create 2 versions:
; i.e., (double-it foo []) should create 2 functions: foo and foo*
(defmacro double-it             
  [fname args & body]       
  `(defn ~fname ~args ~@body) 
  `(defn ~(symbol (str fname "*")) ~args ~@body))

上面的代码并没有像我期望的那样创建两个函数。它只创建最后一个。

user=> (double-it deez [a b] (str b a))
#'user/deez*

我怎样才能得到一个宏来定义两个函数?

最佳答案


; given a function name, its args and body, create 2 versions:
; ie (double-it foo [] ) should create 2 functions: foo and foo*
(defmacro double-it                
  [fname args & body]         
  `(do (defn ~fname ~args ~@body)
       (defn ~(symbol (str fname "*")) ~args ~@body)))

(double-it afunc [str] (println str))

(afunc* "asd")
(afunc "asd")

无需单独引用。

关于macros - 如何创建一个宏来在 clojure 中定义两个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2966014/

相关文章:

set - 你如何使集合 B 成为 A 的子集

c++ - 使用 C++ 宏检查变量是否存在

macros - Clojure 如何在源文件中扩展宏与 Repl

recursion - 普通口齿不清 : error "CDR LST should be a lambda expression"

list - 编写一个返回偶数列表的方案

amazon-web-services - 如何使用 Amazonica 库在 Clojure 中设置 S3 路径样式?

java - Clojure - 从字节数组中删除 0?

javascript - 使用本地文件的 Web 身份验证

macros - nim - 自定义宏/pragma 以获取完整模块但获取 "cannot attach a custom pragma"

c - 使用循环定义的宏