LINUX.ORG.RU

Интесресное свойство BASH. Модель Rust + Bash.

 ,


0

3

Интересное свойство bash/shell открыл для себя. Решил попытаться вникнуть в язык Rust. Для примера взял старый, измученный мной, алгоритм перебора перестановок Нараяны. Переписал его и уткнулся в то, что не так легко и элегантно новичку найти способ перевести аргумент командной строки в число. В C89 с приведением типов как-то просто. Искал варианты: все те, что нашёл, относительно синтаксиса и на мой субъективный взгляд, показались трудными для восприятия. Вдруг осенило меня, - можно же использовать в качестве инициализирующего скрипта bash. И появилась такая модель:

  1. Перебор перестановок на Rust с самым простым синтаксисом: данные пользователя хранятся в векторах, в самом скрипте.
  2. Стартовый скрипт на Bash создаёт копию основной программы, забирает аргументы командной строки, создаёт новые векторы и перезаписывает их в основной программе с помощью sed. Безопасно и просто. Результат: https://github.com/dcc0/permutations_rust

Найс траленк.

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

Rust в целом порадовал скоростью строгостью.

Но такого типа вещи оттолкнули: some_string.parse::().unwrap();

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

тебя в какую сторону подтолкнуть, к расту или от него?

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

Ну тогда i32::from_str_radix

Ошибки будь любезен обрабатывать (или unwrap).

Для нормального разбора параметров можно взять clap или т.п.

AlexVR ★★★★★
()

Решил попытаться вникнуть в язык Rust

@

Не осилил вызов функции перевода строки в число

@

Смотрите у меня есть скрипт который при новых входных перекомпилирует всю программу. Просто и безопасно, а главное удобно!

Анон, срочно откликайся на все вакансии сеньера девелопера, ты сейчас на интеллектуальном пике. Лучше этого ты уже ничего не сделаешь

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

Моя претензия состоит в том, что код нечитабельный: вместо того, чтобы ясно выражать изначальное намерение программиста (получить целое из строки), код представляет собой нагромождения из бойлерплейта и кракозябр.

+ Aswed

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

Спасибо. И воздержусь от осиляния Rust, хоть что-то есть в нём.

«Лучше этого ты уже ничего не сделаешь» Спс за совет. Не планирую

anonymous
()

В итоге: для себя понял, что менять одно на другое смысла особенно нет. С на Rust. Т.е. для простой алгоритизации достаточно и С89 с стандартными библиотеками.

anonymous
()

Решил попытаться вникнуть в язык Rust.

Эка тебя вштырило. Многие с него уже слазят.

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

С 1 стороны, каждый раз вызывать compiler накладно. С другой стороны, при такой модели можно сделать ть в прекомпилированные файлы на каждый случай. А таких случаев с учётом скорости пользовательских машин, думаю, что не больше 15.

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

Сегфолтов при эксепшне не бывает, не ври.

Кстати, а то, что паник в расте работает точно так же, как эксепшн, это чистая случайность, да?

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

Про сегфолты это был трололо. Но если серьезно, то не так же. Разница в том, что в расте у тебя в stderr вывалится стек вызовов как питоне каком-нибудь, что позволит тебе отдебажить проблему гораздо быстрее. Ну и еще в том, что в данном примере .unwrap() это явный вызов, что позволит еще на ревью кода увидеть, что такое нельзя пропускать.

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

Очень смешно :) Ради острот на форум и ходим.

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

Киллер-фича в простом и универсальном API, не зависящем от locale, а вовсе не в Result-подобном возвращаемом значении.

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

Разница в том, что в расте у тебя в stderr вывалится стек вызовов как питоне каком-нибудь, что позволит тебе отдебажить проблему гораздо быстрее.

У всех трех мажорных компиляторов поддерживается вываливание стек трейса.

Ну и еще в том, что в данном примере .unwrap() это явный вызов, что позволит еще на ревью кода увидеть, что такое нельзя пропускать.

Нет, потому что чужой код никто не ревьюит. Может быть, в крупных компаниях – но уж точно не в мелких программах на расте.

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

Но если серьезно, то не так же. Разница в том, что в расте у тебя в stderr вывалится стек вызовов как питоне каком-нибудь, что позволит тебе отдебажить проблему гораздо быстрее.

Основная разница состоит в том, что в rust (в отличие от c++ и питона) исключений нету, есть только unrecoverable panic.

Ну он же плюсовик. Зачем плюсовику обрабатывать экзепшены. У них на это есть сегфолты

Исключения предназначены для того, чтобы отделить код обработки исключительных ситуаций от кода реализующего основной сценарий работы. Нужно быть конченым дегенаратом, чтобы каждый вызов каждой функции оборачивать в отдельный try...catch, как вы с антошей тут хотите.

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

Были бы эксепшны по Саттеру – не нужен был бы закос под Result.

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

Ну или так, не суть. ТС просто как-то совсем уж мимо доки глядел. Да хотя бы простым гуглопоиском воспользовался бы. Так нет, решил удалять гланды через другое отверстие.

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

Мне кажется, ответ в самом вопросе.

И чем тебе нормальные способы не нравятся?

Вон @vertexua предложил ещё один вариант. Тоже плох?

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

C++:

 entities.erase(std::remove_if(entities.begin(), entities.end(), [&entity](Entity other) {
        return entity == other;
    }), entities.end());

Swift/Kotlin всякие JS:

 entities.removeAll { $0 == entity }

ponchik-2
()
Ответ на: комментарий от anonymous

Но такого типа вещи оттолкнули: some_string.parse::().unwrap();

Дело привычки, мне turbofish нравится, но можно и без него.

А вместо unwrap использовать ? или expect или ещё какой метод.

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

Можно и без turbofish, в чём проблема? От <> в глазах рябит? Ну так иди в лиспоподобные языки, там тебе будут одни ()

WatchCat ★★★★★
()
Ответ на: комментарий от ponchik-2

entities.erase(std::remove_if(entities.begin(), entities.end(), [&entity](Entity other) {
return entity == other;
}), entities.end());


Да, c++ ублюдский язык, в том числе потому, что описание логики на нём замусоривается бесполезным бойлерплейтом. Однако в rust по сравнению с c++ читабельность кода ещё снизили. Как заглянешь в него - блевать хочется.

Кстати, твой пример можно записать без лямбд, будет капельку лучше:

v.erase(std::remove(v.begin(), v.end(), entity), v.end());


PS Капельку лучше, но всё равно, конечно, больная на всю голову хрень.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 2)
Ответ на: комментарий от WatchCat

в чём проблема

Проблема в том, что на нормальном языке это должно записываться вот так:

int(some_string)

Без полудюжины кракозябр и без inline придрачивания на возможные ошибки.

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

ну раст мудрёный я на нем не так много писал, но именно по читабельности имхо лучше чем c++ получается, но во времена js/swift/котлин и это перебор.

ponchik-2
()
Ответ на: комментарий от ponchik-2

хотя тут дело привычки, я как apple макака уже и objc без боли читаю.

ponchik-2
()
Ответ на: комментарий от Manhunt

И что же должно произойти, если some_string - не число, число не в десятичной системе, число, которое не влезет в переменную? Вот поэтому some_string.parse().unwrap(), а не int(some_string).

anonymous-angler ★☆
()
Ответ на: комментарий от anonymous-angler

int(some_string)

И что же должно произойти, если some_string - не число

Поскольку int() не может выполнить ту задачу, которая на него возложена, то для него это - исключительная ситуация. На случай такой ситуации, где-то в сторонке от основного кода должен иметься обработчик исключительных ситуаций, которому и должно быть передано управление. Собственно, в c++/java/python этот подход широко практикуется.

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.