我正在尝试编写一个宏教程,现在我需要一些简单易懂但又引人注目的示例.
问题是很多明显的事情已经在clojure和contrib中.我觉得"看,我们可以重新实现所有的库函数"可能不是宏为什么如此伟大的最好的论据.
有没有人有任何可爱的(单行是最好的)例子,他们不介意我使用?
以下是本教程的前三部分.目前这有点危险,所以任何关于如何做得更好的评论都会感激不尽.
http://learnclojure.blogspot.com/2010/09/clojure-macro-tutorial-part-i-getting.html
http://learnclojure.blogspot.com/2010/09/clojure-macro-tutorial-part-ii-compiler.html
http://learnclojure.blogspot.com/2010/09/clojure-macro-tutorial-part-ii-syntax.html
我正在使用clojure中的一些加密软件.它非常有趣并且使用单元测试使它更有趣,因为我不会对破坏事情感到紧张.问题是所有加密函数每次都会产生不同的结果,因为它们是由一个相当不错的IMHO psudo随机数生成器驱动的.
我如何测试随机函数?
当然还有绑定宏!
(defmacro with-fake-prng [ & exprs ]
"replaces the prng with one that produces consisten results"
`(binding [com.cryptovide.split/get-prng (fn [] (cycle [1 2 3]))
com.cryptovide.modmath/mody 719
com.cryptovide.modmath/field-size 10]
~@exprs))
Run Code Online (Sandbox Code Playgroud)
然后我将测试函数包装进去 (with-fake-prng (deftest mytest ....))
clojure有很多这些"绑定宏".喜欢with-out-string等等.
我还有一个宏,它将每个命名空间加载到repl中.(现在我已经切换到蛋糕,我不会用这么多)
(defmacro load-all []
'(use
:reload-all
'com.cryptovide.modmath
...
'com.cryptovide.gui
'com.cryptovide.checksum
'com.cryptovide.log))
Run Code Online (Sandbox Code Playgroud)
ps:永远记住宏观俱乐部的第一条规则
我想更多地讨论模式:何时以及如何使用宏。例如...
binding,with-open, ...
(let [~x (get-resource)] (try ~@dostuff (finally (release-resource ~x))))Run Code Online (Sandbox Code Playgroud)defn, defsnippet(enlive), defservice(ring)with-bindings