LINUX.ORG.RU

Добавление сахарку в C++ для быстрого написания «скриптов»

 ,


1

1

Доброй ночи. Ищу способ добавления ещё большего количества синтаксического сахара в C++, чтобы можно было писать компактные и выразительные небольшие приложения. Скажем, в качестве замены простыни из Perl/Bash/Python.

Допускаю использование любых библиотек, хэдеров, и фреймворков, в том числе и построенных на boost и qt4/qt5 (без GUI).

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

Попытки сделать это через boost (в том числе и boost::filesystem) или через glibc выливаются в лапшу из кода с кучей дополнительных телодвижений.

Вот пример относительно простого способа прочитать конфиги в алфавитном порядке из указанной директории (самым приятным пока рассматриваю вариант с Qt5)

QDir dir(QString::fromStdString(path));
if(!dir.exists()) {
    std::cerr << path << " does not exist\n";
    return 1;
}

for(const QFileInfo &fileinfo : dir.entryInfoList(QDir::Files | QDir::Readable, QDir::Name)) {
    QFile file(fileinfo.absoluteFilePath());
    file.open(QIODevice::ReadOnly);
    if(!file.isOpen()) {
        std::cerr << "Can't open file: " << qPrintable(file.fileName()) << "\nReason: " << qPrintable(file.errorString()) << '\n';
        return 1;
    }
    // ...
}

Тем не менее, я считаю его многословным, ряд действий можно было бы упаковать в обёртки. Писать свою тоже можно, но вдруг уже кто-то сделал подобное.

У кого какие идеи?

★★★★★

Последнее исправление: Chaser_Andrey (всего исправлений: 5)

Ответ на: комментарий от Chaser_Andrey

зачем строчки, зачем циклы...

for (auto  file : dirFiles(path).sorted(byName))
    {
        // ...
    }

anonymous
()

Попробуй Java.

Files.list(home)
     .filter(p -> p.toFile().isFile())
     .sorted()
     .forEach(file -> {
         System.out.println(file.toString());
     });
anonymous
()

У кого какие идеи?

встрой Lua и забудь про свой недосахар

umren ★★★★★
()
Ответ на: комментарий от nanoolinux

Не всё так просто. Может понадобиться обработка текста в этих файлах, учитывание атрибутов файлов, и прочее. На баше получится лапша побольше C++, особенно при работе с хеш-таблицами или словарями.

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от Chaser_Andrey

QFile в деструкторе закрывает файл

QFile - это не совсем, а точнее совсем не дескриптор файла. Просто они позаботились о закрытии дескриптора в деструкторе.

grondek
()
Ответ на: комментарий от grondek

Умные указатели же, не 90-е на дворе то.

pon4ik ★★★★★
()
Ответ на: комментарий от grondek

Для кучи есть умные указатели, я об этом уже который раз толкую. Вот тебе пример:

std::unique_ptr<Foo> foo(new Foo);

При выходе foo из scope будет автоматическое удаление объекта Foo, созданного в куче.

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от four_str_sam

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

pon4ik ★★★★★
()
Ответ на: комментарий от nanoolinux

Конкретно в моём случае работа сугубо с ASCII, так что это не проблема. Но если мне понадобится юникод - то есть удобный QString.

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от grondek

QFile - это не совсем, а точнее совсем не дескриптор файла. Просто они позаботились о закрытии дескриптора в деструкторе.

Да, всё верно. Это просто удобный интерфейс для работы с файлом.

Chaser_Andrey ★★★★★
() автор топика

А зачем?? Ты питон не осилил? Ты пишешь, что медленно.. А где то надо быстрее? Есть реальный пример? Каждый ЯП хорош для своих целей, пытаться писать все на одном — ССЗБ, IMHO) Расслабься, потрать 3 часа на знакомство с питоном и радуйся жизни!

Платформы, где нет питона? Ты уже столкнулся с этой проблемой?

kardapoltsev ★★★★★
()

Если и делать такую наркоманию, то заранее пытаться приводить ее к виду скриптоты. Скажем Perl:

my $dir = $path;
-d $dir or die "$dir is not a directory";

opendir my $dh, $dir;
for my $file (readdir $dh) {
    open(my $fh, '<', File::Spec->catfile($dir, $file)) 
        or die "Cannot open $file for reading"; 
    # ...
}
closedir $dh;

Хотя... на второй взгляд не такой уж С++/Qt и многословный. Но в перле можно еще glob заюзать.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от kardapoltsev

А зачем??

С каждым новым стандартом писать на C++ можно всё приятнее и выразительнее. Всё больше новых фич и синтаксического сахара. Да и такие библиотеки, как Qt и boost не стоят на месте.

Ты питон не осилил?

Осилил. Perl ещё лучше знаю. И я не вижу в них радикальных преимуществ для скрипта больше, чем на полэкрана. На C++ я пишу столь же быстро.

Платформы, где нет питона? Ты уже столкнулся с этой проблемой?

Зачем мне ваш питон? =] У меня и C++ есть.

Расслабься, потрать 3 часа на знакомство с питоном и радуйся жизни!

С таким же успехом я могу расслабиться, за 3 часа (вообще-то меньше) решить нужную проблему на C++ и продолжать радоваться жизни.

Я не отрицаю нужность скриптовых языков вообще, но их значимость для меня преувеличена. Слишком простые вещи можно сделать прямо на bash, для чего-то посерьёзнее я перехожу на C++.

Ах да, я ещё не люблю динамическую слабую типизацию. Очень.

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от Chaser_Andrey

А зачем писать такие вещи на C++, если, считая пять хотелок за исключением четвёртой, можно писать на... хаскеле? :)

for (auto  file : dirFiles(path).sorted(byName))
getDirectoryContents dir <&> sort >>= mapM_ ...
motto
()
Ответ на: комментарий от Chaser_Andrey

Ах да, я ещё не люблю динамическую слабую типизацию. Очень.

В Python строгая динамическая типизация. Впрочем, слабая тоже неплоха, если исключительно для скриптов использовать.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

Статическая типизация. Мне не по душе языки с динамической типизацией.

И поэтому ты используешь слаботипизированное говно с полным отсутствием нормальной системы типов и их вывода

buddhist ★★★★★
()
Последнее исправление: buddhist (всего исправлений: 1)

ещё большего количества синтаксического сахара в C++

Не боишься, что слипнется?

buddhist ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

За 3 часа... А обсуждаем второй день) написал бы уже библиотеку, сделал для нее deb, rpm, ebuild... протолкнул в репозитории... И все бы отказались наконец от питона. Ах да! Еще документацию неплохо бы. Уложишься в 3 часа?

kardapoltsev ★★★★★
()
Ответ на: комментарий от buddhist

И поэтому ты используешь слаботипизированное говно с полным отсутствием нормальной системы типов и их вывода

Узнать тип я могу по typeid(), а выводить мне зачем? Да и узнавать тип нужно только при полиморфизме. В рядовых задачах это нахрен не надо, компилятор и статический анализатор сами проверяют.

Что ж до слабой типизации - как по мне, так C++ балансирует между слабой и сильной. Избежать слабой типизации можно умышленно, делая конструкторы объектов с ключевым словом explicit.

Chaser_Andrey ★★★★★
() автор топика
Ответ на: комментарий от kardapoltsev

И все бы отказались наконец от питона

Им и сейчас ничего не мешает.

Уложишься в 3 часа?

Моя проблема уже решена, я просто ищу способы возможной оптимизации с заделом на будущее. Нет, создание пакетов и документации я не включал в эти 3 часа. Если получится что-то интересное - то можно будет рассмотреть создание отдельной библиотеки, но если это будет две с половиной функции - то уж проще просто выложить .h и .cpp на gitorious.

Chaser_Andrey ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.