clojure实战——宏
本博客主要介绍clojure中宏相关的基础知识,因为自己没能很深入研究clojure的宏,所以做不到深入的讲解。但根据自己及什么clojure用的比较好的人的经验,能不用宏就不用宏,用宏、特别是逻辑复杂的宏机会真的很少,因此我个人觉得本博客所涉及的东西已经足够应付一般的场景了。
clojure宏概述
clojure宏在编译期间被求值,而不是文本替换(和C语言的预编译不同),宏的求值过程也叫做”宏展开”;
宏求值的结果是返回一个clojure的数据结构,这个数据结构会代替宏原来的位置。
clojure的源代码会被clojure reader读入,将其以文本形式求值出一个clojure数据结构,如:(fn [a] :a 123)求值出来的数据结构是一个列表:包含一个符号,一个包含符号的vector,一个关键字和一个数字;而这个数据结构本身就是clojure语言的基本数据结构。同样,宏(reverse-it (nf [a] :a 123))也会返回一个同样的数据结构。
一门语言的代码可以用语言自身的数据结构来描述,称为”同像性”
一个简单的宏
一个翻转符号(symbol)的宏(必须将clojure的符号反着写,如prn必须写成nrp)
(defmacro reverse-it
[form]
(walk/postwalk #(if (symbol? %)
(symbol (str/reverse (name %)))
%)
form))
(