2013-04-08 3 views
2

Я использую CounterClockWise для разработки моего первого проекта Clojure на ОС Windows 7. Помимо javascript (который я не слишком хорошо знаю), это мой первый динамически типизированный язык.Какие методы я могу использовать для отладки моего кода Clojure?

Самая сложная часть моего проекта заключалась в отладке проблем, которые у меня были. Техника, которую я использовал, заключается в том, чтобы посыпать println s в местах, чтобы подтвердить, что мои входы и выходы - это то, что я хочу, чтобы они были.

По сравнению с Java, кажется, что многие функции Clojure принимают то, что я считаю вводом мусора, и с радостью возвращаю ноль. В результате исключение среды выполнения, которое вы видите, может исходить от многих функций от причины проблемы. Моя точка зрения, может быть трудно даже знать, куда положить println.

И эти исключения во время выполнения выдавали скомпилированные номера строк кода, поэтому они не были очень информативными. Большинство моих функций были короткими и свободными от побочных эффектов, но проблема в том, что мои материалы были веб-страницами. Иногда вход в функцию был сырой html, иногда это был проанализированный html (по запросу), иногда это был список ссылок (с помощью css-подобного селектора на анализируемом html). Эти входы могут быть глубоко вложенными, сложными структурами (т. Е. Списком карт карт списков карт), поэтому их было непросто собрать вручную. Когда у вас есть трассировка стека, которая не указывает на проблему, мне бы очень пришлось отлаживать половину моей программы и выяснить, как создавать входы для каждой части. Это заняло много времени.

На IRC-канале кто-то сообщил мне об stacktrace library, который значительно облегчил отладку. Он все еще указывал на многие функции от источника плохого ввода, но он по-прежнему был полезен. Я ищу больше таких методов. Какие методы я могу использовать для более эффективного отладки моего кода?

ответ

1

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

Кроме того, вы можете использовать Java отладчик/точки останова с помощью La Clojure плагин для IntelliJ IDEA - см мой ответ: How to run/debug compojure web app via counterclockwise (or la clojure) для получения более подробной информации об использовании IDEA для запуска & проектов отлаживать Clojure.

+0

Я ответил на это в OP, см. Мое обновление. Спасибо –

+0

Несомненно, в этом случае вы описали, что использование отладчика из IntelliJ IDEA может быть лучшим решением. Вы также можете отслеживать свои вызовы функций с помощью пакета clojure.tools.trace, но если аргументы ввода/вывода являются большими, я не думаю, что он был бы читабельным. –

1

Если при вызове других функций возникает проблема ввода/неожиданного вывода мусора, возможно, вы можете немного перестроить свой код, чтобы эти точки касания были инкапсулированы в свои собственные функции с заданными условиями до/после. например http://blog.fogus.me/2009/12/21/clojures-pre-and-post/

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

+0

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