Какие методы я могу использовать для отладки моего кода Clojure?
Я использую CounterClockWise для разработки своего первого проекта Clojure на ОС Windows 7. Помимо javascript (с которым я не слишком знаком), это мой первый динамически типизированный язык.
Самым сложным в построении моего проекта была отладка проблем, которые у меня были. Техника, которой я пользуюсь - это посыпать println
В местах, чтобы подтвердить мои входы и выходы, я хочу, чтобы они были.
По сравнению с Java, кажется, что многие функции Clojure принимают то, что я считаю вводом мусора, и с радостью возвращают ноль. В результате, исключение времени выполнения, которое вы видите, может исходить от многих функций от причины проблемы. Моя точка зрения заключается в том, что это может быть трудно даже знать, где поставить println
s.
И эти исключения во время выполнения выводили номера строк скомпилированного кода, поэтому они не были очень информативными. Большинство моих функций были короткими и без побочных эффектов, но проблема в том, что мои материалы были веб-страницами. Иногда входные данные для функции представляли собой необработанный html, иногда это был разобранный html (по оживлению), иногда это был список ссылок (с помощью css-подобного селектора в разобранном html). Эти входные данные могут быть глубоко вложенными, сложными структурами (т. Е. Списком карт, картами списков карт), поэтому их было нелегко собрать вручную. Когда у вас есть трассировка стека, которая не указывает на проблему, мне в значительной степени придется отладить половину моей программы и выяснить, как генерировать входные данные для каждой части. Это было довольно много времени.
На канале IRC кто-то сообщил мне о библиотеке трассировки стека, которая значительно упростила отладку. Он по-прежнему уводил многие функции от источника неверного ввода, но он все еще был полезен. Я ищу больше таких техник. Какие методы я могу использовать для лучшей отладки моего кода?
2 ответа
Если ввод мусора / неожиданный вывод является проблемой для вас при вызове других функций, возможно, вы могли бы немного реструктурировать свой код, чтобы эти точки касания инкапсулировались в свои собственные функции с определенными условиями до / после. например, http://blog.fogus.me/2009/12/21/clojures-pre-and-post/
Я уверен, что вы могли бы сделать гораздо приятнее кодирование с небольшой поддержкой макросов. Хотя это может затруднить чтение следов стека.
Поскольку большинство функций в Clojure должно быть довольно коротким (или разложенным, чтобы быть коротким) и обычно работать без побочных эффектов, вы всегда можете попробовать их отдельно от Clojure REPL или написать тесты для них.
Также вы можете использовать отладчик Java / точки останова с плагином La Clojure для IntelliJ IDEA - см. Мой ответ на: Как запустить / отладить веб-приложение compojure с помощью против часовой стрелки (или la clojure) для получения более подробной информации об использовании IDEA для запуска и отладки проектов Clojure.