最近发现一个问题,
在Scheme
中,宏基本是这个写法
(define-syntax define-syntax-rule
(syntax-rules ()
((_ (name pat ...) body ...)
(define-syntax name
(syntax-rules ()
((_ pat ...)
body ...))))))
而在Clojure
中
(defmacro ->>
"Threads the expr through the forms. Inserts x as the
last item in the first form, making a list of it if it is not a
list already. If there are more forms, inserts the first form as the
last item in second form, etc."
{:added "1.1"}
[x & forms]
(loop [x x, forms forms]
(if forms
(let [form (first forms)
threaded (if (seq? form)
(with-meta `(~(first form) ~@(next form) ~x) (meta form))
(list form x))]
(recur threaded (next forms)))
x)))
Scheme
中的宏就像bash
中的模式匹配,打个通配符就行
而Clojure
是把宏里的代码当作数据结构来操作
这两种宏有区别吗,有没有其他语言也在用类似Scheme
中的宏??