LINUX.ORG.RU

Читабельность Rust, C++ и Go

 , , , ,


0

7

Go:

    func typeList(arch *TFile,
      offset uint32, parseDecl bool) []BStr {

C++:

    std::vector<std::string> typeList(TFile* arch,
        off_t offset, bool parseDecl) {

Rust:

    fn typeList<'a>(arch: &'a TFile<'a>,
      offset: u32, parseDecl: bool) -> Vec<&'a bstr> {

как поддерживать код, если он не читаем?



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

Соответствует.

И это тоже соответствует тому, что в Расте делают.

void foo() {
    // ... 
    do_something();
    // ...
}

// ...
try {
   foo();
} catch (const std::ios_base::failure& e) {
    //...
};
// ...

Одно по форме, другое по содержанию.

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

Соответствует.

Ну тогда к исключениям это не имеет никакого отношения. Ибо запись в rust-е: let x = foo()?.bar()?.baz() в C++ будет раскрываться во что-то вроде:

baz_result x;
{
  const auto foo_res = foo();
  if(!foo_res) return foo_res;
  const auto bar_res = foo_res->bar();
  if(!bar_res) return bar_res;
  const auto baz_res = bar_res->baz();
  if(!baz_res) return baz_res;
  x = move(*baz_res);
}

Тогда как в случае с исключениями в C++ был бы просто код:

const auto x = foo().bar().baz();
без каких-либо промежуточных if-ов и return-ов.

И да, тут речь именно про то, что пришлось бы писать пользователю в C++, поскольку в C++ нет магии try! и ?

И это тоже соответствует тому, что в Расте делают.

Ну вы бы эквивалент в Rust-е бы привели для своего C++ного примера. А то я, например, никак не пойму, куда вы здесь можете ? вставить при вызове foo.

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

К слову, если уж в C++ теперь есть поддержка std::tuple на уровне языка, то в будущем могут запилить и ?. на основе std::optional.

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

Приведи еще примеры

Да аот хотя бы из этого треда:

"?" в Rust — это синтаксический сахар для try!, а try! — это всего лишь упрятанный в макрос код для получения кода возврата, его проверки и вызова return, если код возврата не Ok.

Это же цирк с конями. Помню статейка проскакивала: 5 способов обработки ошибок в раст. Пять, блджад! С этим все так плохо, что городят сахар на сахар на сахар. Что характерно, божественный паттерн-матчинг никто не хочет использовать почему то. Лучше добавим еще аски-арта!

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

Кстати, о синтаксисе макросов. Это просто конфетка! Мне кажется перл переживает упадок в том числе потому, что извращенцы нашли себе более благодатную площадку для гольфа. Впрочем, не исключаю, что все это вырвиглазие сделано с благой целью. Такой сигнал кодерам: избегайте макросов, это для очень-очень специальных случаев.

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

&i32

Вот тоже красота. Сэкономили 2 знака в типе, молодцы. Причем это соседствует с подобной херней:

impl<'a, I: DoubleEndedIterator> DoubleEndedIterator for &'a mut I
Чуете дичайший дисбаланс? Как будто все переключается режим: жава/брейнфак. Вот от любого растокода такое ощущение. Забавно, что для mut закорючки не нашлось. Закончились наверно все :(

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

Т.е. & и mut в расте тебя смущают, а &, * и const в Цэ нет? Что в цэ, что в расте человек не видевший такие закорючки войдет в ступор, а от ** в сишечке вообще выпадет в осадок. Только достаточно почитать доки по языку, и смысл данных закорючек станет понятен. Может ты вместо односимвольных закорючек предлагаешь кейворды типа reference, а mut заменить на mutable? Такое мне не надо. Лишние восемь символов еще печатать.

Причем это соседствует с подобной херней

Создатели раста решили сделать такой вот минималистичный синтаксис.

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

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

А то я, например, никак не пойму, куда вы здесь можете ? вставить при вызове foo.

Просто вытаскиваем проброс исключения из-за сцены

type Result<T> = result::Result<T, Box<Error>>;

fn do_something() -> Result<()> {
    //...
}
fn foo() -> Result<()> {
    // ...
    do_something()?;
    // ...
}
// ...
match foo() {
    Err(ref e) if e.is::<IoError>() => {
        // ...
    }
    result => { 
        // Остальное пробрасываем дальше
        result? 
    }
};
// ...

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

Просто вытаскиваем проброс исключения из-за сцены

Вы специально говорите о чем-то своем?

fn foo() -> Result<()> {
    // ...
    do_something()?;
    // ...
}
Вот это и есть использование ?. И это не имеет никакого отношения к использованию исключений в C++. Поскольку в C++ этот код будет вот таким:
result foo() {
  const auto r = do_something();
  if(r)
    return r;
  ...
}
А вовсе не вот таким:
void foo() {
  do_something();
  ...
}

Обработка ошибок, которую вы выписываете в месте вызова foo не имеет никакого отношения к тому, как ? используется внутри foo.

Соответственно, ? в Rust — это синтаксический сахар над работой с кодами возврата. Аналогии с обработкой исключений в C++ здесь притягиваются за уши. Ну вот приходится Rust-оманам жить без нормальных исключений, поэтому и кажется вам, что ? и try! является адекватной им заменой.

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

Создатели раста решили сделать такой вот минималистичный синтаксис.

иди проспись, пьяная лошадь

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

И прекрасно живут в отличие от.

Ну, если это можно назвать жизнью, то да :)))

Вообще-то у нас с red75prim спор идет не о том, хорошо ли то, что в Rust-е нет исключений, и даже не о том, хорошо ли то, что в Rust-е существует ?. А о том, насколько уместно сравнивать ? с исключениями.

<сарказм>
Если же вы думаете, что в C++ из-за исключений приходится страдать, то вы должно быть удивитесь, но в большом количестве мейнстримовых языков программирования исключения не просто присутствуют, а используются по полной программе (например, Java, JavaScript, C#, Python, Ruby и т.д.). Мейнстримовость этих языков в данном случае служит подтверждением того, что исключения доказали свою практичность в буквальном смысле на миллионах программистов и на миллиардах строчек кода.

Но Rust-у же чужой опыт не указ. От исключений откажемся, зато сделаем паники, будем лепить upwrap-ы и рассказывать про надежность кода ;)

</сарказм>

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

По поводу «'» все просто: слишком мелкий значок.

Этот значок всегда сопровождается буквенным идентификатором. И перед использованием его еще нужно объявить:

struct Foo<'a> {
    bar: &'a str
}
К слову, если бы лайфтаймы были незаметны, на них бы и не жаловались.

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

Этот значок всегда сопровождается буквенным идентификатором.

Не понял, какое это отношение имеет к заметности или незаметности апострофа. Как по мне, так в &'a «глаза ломаются» как раз из-за необходимости обратить внимание на апостроф между аперсандом и буквой.

Могли бы сделать что-то более заметное. Например:

struct Foo<@a> {
  bar: & str @a
}
или
struct Foo<a> {
  bar: & str in a
}
Понятно, что какую-нотацию не выбери, все равно найдутся те, кому она не нравится и кто будет об этом громко кричать. Но, блин, хуже апострофа сложно было что-то выдумать.

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

'a стащили из OCaml, где переменными с апострофом обозначают типовые переменные полиморфных функций. При беглом взгляде мне показалось, что Окамла синтаксис куда упоротей, чем у Раста, но кто-то же пользуется. Я объясняю повышенное внимание к таким мелочам, как синтаксис, хайпом вокруг Раста, который закономерно раздражает и провоцирует чрезмерную придирчивость. Синтаксис как синтаксис, семантика куда больше проблем доставляет, но для этого надо писать код.

@

«Собаку» я предпочел бы вообще не видеть часто в синтаксисе, чересчур жирный символ, привлекает лишнее внимание.

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

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

поправил, не благодари

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

Тебе и подобным могу написать свое мнение по поводу годности/негодности любого ЯП: за исключением случаев абсолютного брэйнфака головного мозга, хоть мало мальски объективное мнение можно получить только после его практического использования. Хочешь орать, что Раст — говно, покажи всем свой код на нём. Хочешь его нахваливать, опять же покажи код.

Лично я к Расту отношусь нейтрально. Взлетит, не взлетит, — у меня нет практической заинтересованности. Но когда я вижу, что его пытаются закопать из-за довольно средней сложности синтаксиса, хочется покрутить пальцем у виска. В конце концов никто не мешает писать на Расте в процедурном стиле, без best practies, и в этом виде он не сильно отличается от какого-нибудь Паскаля.

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

Хочешь орать, что Раст — говно, покажи всем свой код на нём.

Не поверишь, несколько раз подступался к изучению, но всякий раз чувство тошноты от синтаксиса пересиливало.

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

Хочешь орать, что Раст — говно, покажи всем свой код на нём.

тоесть ты из тех людей, кто решает что собачьи какашки не стоит есть после третьей прожеваной ложки) не все такие как ты, увы

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

Ты знаешь, что собачьи какашки несъедобны, потому что тебе мама это сказала в детстве (папа, бабушка, кто-то еще). Версию, что ты их попробовал на вкус, в рассмотрение не берем. Других причин считать собачье дерьмо несъедобным у тебя нет. Неприятный запах? Есть продукты, которые воняют несравнимо хуже, разные сорта сыра, например.

Итого, кто тебе сказал, что Раст — какаха? Сам-то ты его не пробовал, исключая, возможно, пары хеллоуворлдов.

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

Какой у тебя бэкграунд в плане языков программирования? Какие альтернативы ты предпочел Расту в нише системного программирования, если брался за него не просто пощупать хайпанутое поделие?

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

В конце концов никто не мешает писать на Расте в процедурном стиле, без best practies, и в этом виде он не сильно отличается от какого-нибудь Паскаля.

Адепты вырвиглазов всегда так говорят. Потом берешь чужой код, а там повсюду инфернальный песец. Хотя в расте меня больше завораживает не синтаксис даже, а обилие вариантов черезжопно выразить простые вещи, как тот же проброс ошибок. Еще очень радует вездесущий unsafe. Берем эту вашу утилиту fd, например. И... чуть не в каждой процедуре unsafe. То ли у растаманов руки из неподходящего места, то ли эта ваша безопасность - это маркетинговая херня, не выдерживающая столкновения с реальным миром.

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

&i32

Вот тоже красота. Сэкономили 2 знака в типе, молодцы

Какие два знака? Может, у тебя int - слово? Или предпочитаешь красоту типа int32_t?

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

fd

Как, по-твоему, Раст может гарантировать тебе эксклюзивное право работы с файловой системой? И у этих функций с unsafe безопасный интерфейс.

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

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

А что не так с обработкой ошибок? Если ты так утверждаешь, тогда предоставь арументы. Только про «стопицот способов» заливать не надо. Исключениями в крестах тоже никто не заставляет пользоваться. Там ты как в сишке можешь кодами возврата пользоваться или свои костыли нагородить.

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

А что не так с обработкой ошибок?

Видимо, он мельком где-то увидел, что в Расте есть разные пути обработки ошибок.
1. Явный вариативный анализ.
2. Использование комбинаторов (map/map_err, and_then/or_else etc.).
3. Композиция различных типов ошибок определением своих типов ошибок.

Обработка ошибок в Расте действительно требует нехилого напряжения мозгов (из-за непривычности по сравнению с исключениями).

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

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

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

попахивает банальным хейтерством.

попахивает адекватной реакцией на невменяемость растафари

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

синтаксис раста … минималистичен

Нет, у Раста не минималистичный синтаксис, а вполне себе пространный. Я не думаю, что он менее многословный, чем, например, C++. Собственно, у товарища, который был замечен в любви к Ruby, частично поэтому и бомбит.
Haters gonna hate.

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

Такая стандартная, что даже гугл не знает. Может ты мне расскажешь, мой не-деревянный не-глупец? И за одно ссылочку дашь где в расте в ней ансейфы? Хотя по дате регистрации можно сказать, что ты просто жирнявочка, так что лучше просто потеряйся.

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

Хотя по дате регистрации можно сказать

не суди по дате регистрации о квалификации, да не судим будешь по отсутствию аватарки

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

у Раста не минималистичный синтаксис, а вполне себе пространный. Я не думаю, что он менее многословный, чем, например, C++.

Не знаю о чем говорил товарищ, но минималистичность синтаксиса - это малое число грамматических правил. И тут Раст заметно лучше чем C++.

Собственно, все языки в этом лучше чем C++ %)

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

Окей, но у тебя и квалификации видимо тоже ноль, раз не можешь ответить на вопросы.

Окей, но у тебя и квалификации столько же сколько красных пикселей на аватаре

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

Собственно, все языки в этом лучше чем C++ %)

даже корейский?

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

Ясно, вали в игнор, жирнявка.

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

В Rust try! и ? немного разные вещи, если не ошибаюсь. Первое просто разворачивается в match выражение, которое принимает значение Ok или возвращает Err, соответственно этот макрос работает только с Result<Ok, Err>. Второе - встроенный оператор языка, который можно определить для любого типа с помощью трейта std::ops::Try, и который к тому же не обязательно ошибку из функции сразу возвращает. Хотя вроде собираются внутри try! использовать ?, да и трейт, как и возможность поймать ошибку пока не стабилизированы, так что пока на стабильной версии разницы особой нет.

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

Обработка ошибок в Расте действительно требует нехилого напряжения мозгов

О, ну хоть один не орет как в расте все ахуенно легко и красиво.

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

встроенный оператор языка, который можно определить для любого типа с помощью трейта std::ops::Try, и который к тому же не обязательно ошибку из функции сразу возвращает.

Такими темпами лет через 10 Rust будет монстром похлеще чем С++.

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

замечен в любви к Ruby

Руби местами прикольный, что не мешает мне считать его синтаксис уебищным. Но это из серии игрушечных язычков, т.е. вообще нерелевантно. Мы говорим о системщине, и здесь вычурность, магия и tmtowtdy идет нахуй вместе артистичными натурами, которым самовыражаться приспичило в ойти, хотя есть куча других возможностей. Вот некоторые мазюкают абстракции говном на холсте, почему бы вам этим не занятся?

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

Как, по-твоему, Раст может гарантировать тебе эксклюзивное право работы с файловой системой?

Так раст вообще нихуя не может без ансейф. Накропать очередной бессмысленный бэкенд ты конечно можешь. А решать системные задачи без адских оргий со старыми добрыми указателями хрен. Еще один пидорский недоязычок для бэкенда... Ну жрите, хули.

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