Clojure中尚未提供的简单但令人信服的宏观示例

Joh*_*den 12 macros clojure

我正在尝试编写一个宏教程,现在我需要一些简单易懂但又引人注目的示例.

问题是很多明显的事情已经在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

Art*_*ldt 6

我正在使用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:永远记住宏观俱乐部的第一条规则


kot*_*rak 4

我想更多地讨论模式:何时以及如何使用宏。例如...

  • 保护资源。例子:bindingwith-open, ...
    (let [~x (get-resource)] (try ~@dostuff (finally (release-resource ~x))))
    Run Code Online (Sandbox Code Playgroud)
  • 定义事物。示例:defn, defsnippet(enlive), defservice(ring)
  • 宏/驱动程序分离。尤其是这种技术消除了很多宏观痛苦。就像多重评估或捕获一样。例子:with-bindings
  • 美化丑陋的代码。例如。当驯服多维阵列时