В этой небольшой статье мы покажем ряд простых утилит, написанных на D, которые вы можете задействовать в своей работе. Некоторые из этих утилит являются простыми аналогами известных команд Unix, но, несмотря на это, имеют под своим капотом солидный функционал.
Показанный в этой статье код был взят из открытых источников, и к его созданию команда LightHouse Software не имеет никакого отношения (ну почти)…
1. RPN-калькулятор
Код данной небольшой утилиты командной строки мы взяли прямо с главной страницы dlang.org! Там он фигурирует под наименованием “Tiny RPN calculator” и показывает пример использования статического цикла foreach
, который задействован для генерации кода обработки арифметических операций.
Хотя данный код является демонстрацией возможностей стандартной библиотеки, скромная программка, которая получается в итоге, представляет собой довольно функциональный калькулятор. Данный калькулятор работает с выражениями, записанными в обратной польской нотации (RPN – Reverse Polish Notation) и может быть использован для расчетов прямо из командной строки.
void main() { import std.stdio, std.string, std.algorithm, std.conv; // Reduce the RPN expression using a stack readln.split.fold!((stack, op) { switch (op) { // Generate operator switch cases statically static foreach (c; "+-*/") case [c]: return stack[0 .. $ - 2] ~ mixin("stack[$ - 2] " ~ c ~ " stack[$ - 1]"); default: return stack ~ op.to!real; } })((real[]).init).writeln; }
2. wc (words count) – подсчет количества слов
Эта утилита, написанная на D, является результатом принятия вызова в написании самой короткой реализации wc, при сохранении ее производительности. Поведение написанного на D wc повторяет поведение оригинальной утилиты из мира Unix, за исключением отсутствия множества опций оригинального wc. Тем не менее, эта минимальная версия вполне пригодна для повседневных задач, таких как подсчет количества строк в исходных текстах.
Код утилиты, подробное описание и тесты производительности можно увидеть в официальном блоге D.
3. Шестнадцатеричный дамп
Эта утилита позволяет получить наглядный вывод шестнадцатеричного дампа для некоторого файла. Код позаимствован с официального сайта D и фигурирует там под названием “Print hex dump”. Пример работает с текущим файлом приложения (т.е. выводит дамп исполняемого файла для самого себя) и для работы с иными файлами требуется небольшая его модификация, позволяющая выбрать нужный файл через аргумент командной строки или же посредством прямого указания пути в исходном коде.
void main() { import std.algorithm, std.stdio, std.file, std.range; enum cols = 14; // Split file into 14-byte chunks per row thisExePath.File("rb").byChunk(cols).take(20).each!(chunk => // Use range formatting to format the // hexadecimal part and align the text part writefln!"%(%02X %)%*s %s"( chunk, 3 * (cols - chunk.length), "", // Padding chunk.map!(c => // Replace non-printable c < 0x20 || c > 0x7E ? '.' : char(c)))); }
4. which – узнать расположение исполняемого файла
Код данной утилиты, позволяющей узнать путь до некоторого исполняемого файла путем поиска файла по всем расположениям, которые указаны в системной переменной PATH, был найден нами в сборнике идиом D. Утилита является аналогом программы which из инструментария Unix и уступает ей по возможностям. Кроме того, данный кусок кода можно без проблем интегрировать в свои скрипты на D:
// Similar to unix tool "which", that shows the full path of an executable string which(string executableName) { import std.process: environment; import std.path: pathSeparator, buildPath; import std.file: exists; import std.algorithm: splitter; // pathSeparator: Windows uses ";" separator, POSIX uses ":" foreach (dir; splitter(environment["PATH"], pathSeparator)) { auto path = buildPath(dir, executableName); if (exists(path)) return path; } throw Exception("Couldn't find " ~ executableName); }
5. dinclusion – вставка бинарных файлов в исполняемые
Эта утилита написана нашей командой изначально на D и создавалась для того, чтобы из бинарных файлов генерировать интерфейсы на D (это файлы с расширением *.di). Примером работы с данной утилитой служит одна из наших статей (Пишем Валентинку на D), где используется основная идея программы – инкорпорация бинарных данных в файл программы. Также, у нас имеется статья про процесс публикации в DUB данной утилиты. Код dinclusion доступен на официальном репозитории утилиты в Github.
Вот такой топ 5 простых и полезных утилит на D получился у нас. А какие инструменты, написанные на D, вы используете? Может быть вы написали свою интересную утилиту, про которую хотите рассказать? Присоединяйтесь к нашим беседам в Discord!