В clojure, есть ли рекурсивная версия регистрации кода? - PullRequest
1 голос
/ 08 февраля 2011

Я видел несколько вариантов следующего макроса регистрации кода:

 (defmacro log
   "for debugging, output code and code->val to stdout, returns val"
   [code]
    `(let [c# ~code]
      (prn '~code)
      (clojure.pprint/pprint c#)
      c#))

однако, я не видел рекурсивную версию, которая заключает в себе все макросы или функциональные формы в теле кода. У кого-нибудь есть хорошая рабочая реализация?

EDIT:

Чтобы уточнить, возьмите, например, следующий код:

 (map #(+ % 10) (range 5))

, включив это в макрос рекурсивного журнала:

 (r-log (map #(+ % 10) (range 5)))

Макро-расширение этого должно быть:

 (log (map #(log (+ % 10)) (log (range 5))))

Ответы [ 3 ]

2 голосов
/ 09 февраля 2011

немного другой, более целенаправленный подход заключается в вызове функции, которая добавляет функцию log к каждой функции в пространствах имен, над которыми вы работаете, чтобы они регистрировали себя при вызове. это позволит вам увидеть, как работает ваш код, не видя все внутренности карты.

clojure: добавление трассировки отладки для каждой функции в пространстве имен?

1 голос
/ 15 февраля 2011

Хорошо, я придумал следующее. Я думаю, это то, что вы просили:

Примечание logx - это ваш макрос log с аргументом переменной длины code.

 (defmacro logx
   "for debugging, output code and code->val to stdout, returns val"
   [& code]
   `(let [c# ~code]
      (prn '~code)
      (clojure.pprint/pprint c#)
      c#))

 (defn add-logx-calls [code]
   (if (seq? code)
     `(logx ~@(map add-logx-calls code))
     code))

 (defmacro r-log
   [& code]
   (apply add-logx-calls code))

 (r-log (map #(+ % 10) (range 5)))

Я не проверял его ни на чем, кроме образца, который вы мне дали. Если вы улучшите его, дайте нам знать.

1 голос
/ 10 февраля 2011

Я обычно использую clojure.contrib.trace для тактического представления такого рода вещей, лучше объяснил здесь, чем мог:

Отладка в Clojure?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...