Простые, но неотразимые примеры макросов, которые уже не в 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
Ответы
Ответ 1
Я бы сказал больше о шаблонах: когда и как используется макрос. например,...
Ответ 2
Я работаю над некоторым криптографическим программным обеспечением в 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]
[email protected]))
то я завершаю свои тестовые функции в (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))
ps: всегда помните о первом правиле макро клуба