У меня наметилась лишняя неделя безработицы недавно, поэтому устав пялиться в Веб 2.0, я внезапно вспомнил, что программист. Открыл проект игры-"рогалика" на великом и могучем языке программирования Rust, с которым я еще месяц назад носился, как с писанной торбой (с проектом, в смысле), но отложил по паре причин. Из которых первой является то досадное обстоятельство, что библиотека "cursive", которую я выбрал для реализации TUI (консольного интерфейса) игры, не предоставляет на данный момент возможностей раскрашивать произвольные участки текста в текстовых лайотах произвольным же образом. Только моноцвет. А как я по-вашему должен разнообразить вид стены символьных закорючек, в которых пылкое воображение игромана должно разглядеть героев и чудовищ, оружие и злато, степи, стены и леса? Никак.
Вторым же и куда более неприятным затруднением явилась регрессия, наметившаяся в кодовой базе. А если просто, по пацаночке, то игра стала падать при определенных действиях. А значит, надо дебажить.
В общем, долго ли, коротко, а несколько дней назад я открыл проект, окинул горделивым взором килобайты вершины погромистской деятельности своей, потом переключился в "полуночный командир", которым я по недоразумению пользуюсь как файловым менеджером на линуксе, запустил свою игрулю и убедился, что она падает столь же исправно.
Погрустив с минутку, я было ринулся расставлять println'ы aka отладочную печать, а потом подумал, что было бы неплохо использовать такую штуку из Python мира, как декораторы, для облегчения своей доли. То бишь повесил на нужную функцию декоратор, реализующий отладочную печать, скажем, при установленном флаге "DEBUG = true;" при вызове обернутой им функции, и всё, не надо добавлять строчки с принтами, а потом их удалять, когда будут не нужны. К тому же Rust это язык со статической типизацией, а значит, можно сделать так, чтобы декораторы навешивались при включенном флаге отладки во время компилирования, то есть с минимальным оверхедом.
Ребят, если бы я знал, в какую жопу лезу, я бы передумал. Вот я отвечаю.
Но, но, но. Я всё-таки это сделал и сделал, надеюсь хорошо. Поэтому горд неимоверно. И ничего страшного, что на Python декораторы реализуются за 5 минут, просто потому что они уже фактически доступны искаропки, благодаря возможностям языка, а я потратил 5 дней, сражаясь аки лев с конпелятором Rust, и исписав двести строк программного кода (в основном там разбор AST определения функции).
Конечно, пока реализованы не все возможности питоньих декораторов, например, декораторы с добавочными аргументами или декораторы структур и типажей (хотя тут подозреваю, я надорвусь, если возьмусь делать). Но основа: взять функцию и подменить ее обёрткой, — сделана, и этим можно пользоваться. А вот и ссылка на репозиторий:
А теперь можно и приступить к отладке "рогалика". О боже, дай мне сил…
Похожие файлы
Здесь находятся
всего 0. За сутки здесь было 0 человек
Размечтался . До сих пор дописываю и переписываю свою библиотечку декораторов. Потому что в процессе использования обнаружились недочёты.
Тут дело вот в чем. Я не нашел нигде внятной спецификации синтаксиса Rust в виде набора регулярных выражений. Вот в Python, например, в стандартной библиотеке есть модули token и tokenize, в которых есть и регулярки, описывающие его синтаксис, и удобный итератор для обработки исходника. А в Rust… Единственное, что нашел файл синтаксиса плагина Rust Enhanced для редактора Sublime Text 3. Но там он выполнен в соответствии с внутренним API, и его сложно читать.
Поэтому я исходник Rust функции обрабатываю ручками, а поскольку растут они из попы, иногда исходник пачкается . Вот леплю костыли по мере обнаружения дефектов.
-------------
Добавлено в 15.28: Произошло знаменательное событие: я допилил декораторы (как вам названия "rustorators" или "decorustors?") до возможности указания для декораторов дополнительных аргументов. Теперь создавать трассирующие декораторы проще простого, а именно для этого я всё это и затевал. Подробности — в замечательном README репозитория.
0 ответить