Топ 5 полезных утилит, написанных на D

В этой небольшой статье мы покажем ряд простых утилит, написанных на 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!

Добавить комментарий