Подтвердить что ты не робот

Простые, но неотразимые примеры макросов, которые уже не в 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

4b9b3361

Ответ 1

Я бы сказал больше о шаблонах: когда и как используется макрос. например,...

  • Защита ресурса. Примеры: binding, with-open,...
    (let [~x (get-resource)] (try [email protected] (finally (release-resource ~x))))
  • Определение вещей. Примеры: defn, defsnippet (оживить), defservice (кольцо)
  • Разделение макросов/драйверов. Особенно эта техника отнимает много макро боли. Как многократная оценка или захват. Пример: with-bindings
  • Украшающий уродливый код. например. когда Укрощение многотоновых массивов

Ответ 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: всегда помните о первом правиле макро клуба