Clojure China

clojure 宏写宏

share
#1

以下转自我的博客:oschina
相比较common lisp

(defmacro t1 (fn-name)
    `(defmacro ,fn-name (x)
       `(+ ,x 1)))
(defmacro t1 [name1] 
 `(defmacro ~name1 [x]
  `(+ ~x 1)))

会出问题,
必须用autogensym

(defmacro t1 [name1] 
  `(defmacro ~name1 [x#]
   `(+ ~x# 1)))

总结: clojure 的宏还是有些弱, 虽然防止了变量的陷阱. common lisp的宏略微强些, 但可能有副作用, 可能射到脚趾

#2

不确定你的场景,但如果你内部的变量 x 必须用 x 这个名字的话,可以这么做:

(defmacro t1 [name1] 
  `(defmacro ~name1 [~'x]
     (+ ~'x 1)))

不需要嵌套的 ```

1赞