Clojure宏:从基础到应用
1. 宏基础与语法错误
在Clojure中,使用不当的语法会导致读取器失败。例如下面的代码,甚至无法进入编译阶段:
(defmacro foo []
`(if (= 0 (rand-int 2))
(println "foo!))) ;; oops, forgot a closing quote
;= #<Exception java.lang.Exception: EOF while reading string>
与Ruby的 eval 相比,Clojure宏有明显不同。在Ruby里, eval 操作的代码是字符串,这种字符串没有结构,操作它只能使用处理字符串的工具,如正则表达式、拼接和子字符串操作。而Clojure是同像性的,宏直接处理Clojure的数据结构,如列表、向量、符号等。操作字符串形式的源代码很脆弱且容易出错,而且错误要到代码求值时才会被捕获,这使得过程很危险。下面是Ruby中一个糟糕的示例:
>> def print_sym(x)
>> code = "p(" + x + ".to_sym)"
>> end
nil
>> eval print_sym "\"foo\""
:foo
nil
而在Clojure中,对应的代码则简洁且安全:
超级会员免费看
订阅专栏 解锁全文
72

被折叠的 条评论
为什么被折叠?



