The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск Rust 1.79. Создан консорциум для разработки высоконадёжных систем на Rust, opennews (??), 13-Июн-24, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


123. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +1 +/
Сообщение от freecoder (ok), 14-Июн-24, 11:29 
А в чём избыточность?
Ответить | Правка | Наверх | Cообщить модератору

252. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от Наноним (?), 14-Июн-24, 17:59 
let, fn, куча ненужных символов
Ответить | Правка | Наверх | Cообщить модератору

334. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от Прохожий (??), 15-Июн-24, 02:51 
То не избыточность. То просто вы плаваете в предметной области.
Ответить | Правка | Наверх | Cообщить модератору

378. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +1 +/
Сообщение от n00by (ok), 15-Июн-24, 12:07 
В Бейсике было ключевое слово let, но обычно можно было его не писать - транслятор размером 8Кб вполне справлялся.
Ответить | Правка | Наверх | Cообщить модератору

416. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +1 +/
Сообщение от _kp (ok), 15-Июн-24, 23:18 
Там это было для упрощения интерпретатора, и конкретно интерпретации байткода, когда при вводе операторы упаковывались в один байт. Более умные Бейсики довольно быстро избавились от лишних рудиментов в исходнике.

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

Ответить | Правка | Наверх | Cообщить модератору

427. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 16-Июн-24, 10:37 
Так свойства переменной можно записывать перед её именем. Но в Rust решали как раз эту "проблему" Си, вот и let на каждый чих.
Ответить | Правка | Наверх | Cообщить модератору

429. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от freecoder (ok), 16-Июн-24, 13:38 
> Так свойства переменной можно записывать перед её именем. Но в Rust решали
> как раз эту "проблему" Си, вот и let на каждый чих.

Вот статья специально для таких как вы была написана: https://habr.com/ru/articles/532660
Раздел "Постфиксная запись типа".

Ответить | Правка | Наверх | Cообщить модератору

436. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 16-Июн-24, 15:20 
>> Так свойства переменной можно записывать перед её именем. Но в Rust решали
>> как раз эту "проблему" Си, вот и let на каждый чих.
> Вот статья специально для таких как вы была написана: https://habr.com/ru/articles/532660
> Раздел "Постфиксная запись типа".

Специально для писателей того раздела, пугающих читателя "int (*fns[16])(int * const * p);", в Си и Си++ придумано ключевое слово typedef. А в C++ из OCaml, на котором была написана первая версия транслятора Rust, заимствован вывод типов по алгоритму Хиндли–Миллнера.

Специально для писателей слов "простой парсер" написана бородатая Драгонбук, где вводится термин "семантический анализ".

Я так и не понял, что я должен был почерпнуть из того раздела. Или надо было читать следующий, где let служит для сопоставления с образцом? Ну так тогда можно сказать, что избыточны все остальные конструкции.)

Ответить | Правка | Наверх | Cообщить модератору

458. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от Прохожий (??), 17-Июн-24, 02:32 
>вот и let на каждый чих

На какой каждый? Объявляет новую переменную - появляется let. Занимаетесь присваиванием - нет никакого let.

Ответить | Правка | К родителю #427 | Наверх | Cообщить модератору

481. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 17-Июн-24, 10:41 
>>вот и let на каждый чих
> На какой каждый? Объявляет новую переменную - появляется let.

Вот на этот. Тип при объявлении указан? Значит let лишний, если об этой задуматься.

Например, есть let, но тип int не указывается, а выводится:

let i = 1;;

Ответить | Правка | Наверх | Cообщить модератору

492. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от freecoder (ok), 17-Июн-24, 14:44 
Здесь уже давно отвечено:

https://stackoverflow.com/questions/32180684/why-does-rust-u...

Ответить | Правка | Наверх | Cообщить модератору

496. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 17-Июн-24, 15:56 
> Здесь уже давно отвечено:
> https://stackoverflow.com/questions/32180684/why-does-rust-u...

Там отвечено на вопрос "зачем", а не "зачем лишнее".

Ответить | Правка | Наверх | Cообщить модератору

505. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от freecoder (ok), 17-Июн-24, 18:29 
> Там отвечено на вопрос "зачем", а не "зачем лишнее".

Если использовать let в месте типа, то сложится впечатление, что его можно использовать как заменитель типа, но это не так. Например, в сигнатурах функций - нельзя. В указании типа в обобщённых типах - нельзя. И т.д. С текущим синтаксисом больше консистентности: let - это именно отдельная инструкция сопоставления с образцом, в которой могут быть введены новые имена (переменные) в составе образца. Аннотация типа (": Type") при этом может не указываться - тогда она просто пропускается без необходимости её на что-то заменять.

В этом принципиальное отличие let от плюсового auto, который действительно является заполнителем типа.

Ответить | Правка | Наверх | Cообщить модератору

522. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 18-Июн-24, 12:41 
>[оверквотинг удален]
> Если использовать let в месте типа, то сложится впечатление, что его можно
> использовать как заменитель типа, но это не так. Например, в сигнатурах
> функций - нельзя. В указании типа в обобщённых типах - нельзя.
> И т.д. С текущим синтаксисом больше консистентности: let - это именно
> отдельная инструкция сопоставления с образцом, в которой могут быть введены новые
> имена (переменные) в составе образца. Аннотация типа (": Type") при этом
> может не указываться - тогда она просто пропускается без необходимости её
> на что-то заменять.
> В этом принципиальное отличие let от плюсового auto, который действительно является заполнителем
> типа.

У меня сложилось впечатление, что тут:

let sum = {
    let a = 1;
    let b = 2;
    a + b
};

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

Ответить | Правка | Наверх | Cообщить модератору

529. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от freecoder (ok), 19-Июн-24, 08:32 
В данном примере значение выражения (выражением является блок, возвращающий своё последнее вычисленное значение) сопоставляется с образцом, который состоит только из одного нового имени. Это частный случай образца.
Ответить | Правка | К родителю #522 | Наверх | Cообщить модератору

534. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 20-Июн-24, 09:41 
> В данном примере значение выражения (выражением является блок, возвращающий своё последнее
> вычисленное значение) сопоставляется с образцом, который состоит только из одного нового
> имени. Это частный случай образца.

let sum = {
    let a = 1;
    let b = 2;
    a + b
}

То есть "образец" здесь "sum"? С чем в данном примере он с сопоставляется?

Если имеется ввиду подстановка вместо sum "блока", когда sum встречается где-то в другом месте, так называйте вещи своими именами. Знакомые с функциональными языками поймут, программисты на Си воспримут как "похоже на макрос". Пока получаются пёрлы из разряда "неизменяемая переменная" и "функциональный язык - это когда много функционала".

Ответить | Правка | К родителю #529 | Наверх | Cообщить модератору

537. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от freecoder (ok), 21-Июн-24, 09:30 
Это не похоже на макрос. Выражение вычисляется в данном месте и имя sum обозначает вычисленное значение. Вместо одного имени там потенциально мог быть более сложный паттерн. Сопоставление значению выражения нового имени - это частный случай сопоставления с образцом вообще.
Ответить | Правка | К родителю #534 | Наверх | Cообщить модератору

543. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 22-Июн-24, 18:22 
> Это не похоже на макрос.

Это похоже на макрос с т.з. программиста на Си.

> Выражение вычисляется в данном месте и имя
> sum обозначает вычисленное значение. Вместо одного имени там потенциально мог быть
> более сложный паттерн. Сопоставление значению выражения нового имени - это частный
> случай сопоставления с образцом вообще.

"Сопоставление с образцом" на инглише "pattern matching". Обычно это ключевое слово match.

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

Когда вместо имени подставятся "сопоставленное" в некоем определении выражение, это называется "подстановка". В Си так происходит с макросами.

Ответить | Правка | К родителю #537 | Наверх | Cообщить модератору

559. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от freecoder (ok), 23-Июн-24, 12:11 
> Это похоже на макрос с т.з. программиста на Си.

Это не похоже на Си-макрос совершенно.

> "Сопоставление с образцом" на инглише "pattern matching". Обычно это ключевое слово match.

match в Rust осуществляет сопоставление в общем виде, но есть ещё if let, let и let else, которые используются для сопоставления в специальных случаях.

let требует, чтобы записанный паттерн полностью соответствовал значению, с которым он сопоставляется (паттерн должен покрывать все возможные значения выражения справа).
if let и let else допускают уже только частичное покрытие.

> То есть есть некий образец, и есть данные. Если они каким-то образом
> подходят под образец, значит сопоставление происходит успешно, иначе рассматривается
> другой образец (если он есть).

Так работает match, в котором могут быть указаны несколько паттернов и они в совокупности должны покрыть все варианты. В let указывается только один паттерн, поэтому только он и должен покрыть все варианты. Ну либо не все, тогда нужно использовать let else.

> Когда вместо имени подставятся "сопоставленное" в некоем определении выражение, это называется
> "подстановка". В Си так происходит с макросами.

В Rust нет никакой "подстановки", а есть pattern matching в let: https://doc.rust-lang.org/book/ch18-01-all-the-places-for-pa...

Ответить | Правка | К родителю #543 | Наверх | Cообщить модератору

562. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 24-Июн-24, 20:12 
>> Это похоже на макрос с т.з. программиста на Си.
> Это не похоже на Си-макрос совершенно.

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

>> "Сопоставление с образцом" на инглише "pattern matching". Обычно это ключевое слово match.
> match в Rust осуществляет сопоставление в общем виде, но есть ещё if
> let, let и let else, которые используются для сопоставления в специальных
> случаях.
> let требует, чтобы записанный паттерн полностью соответствовал значению, с которым он сопоставляется
> (паттерн должен покрывать все возможные значения выражения справа).
> if let и let else допускают уже только частичное покрытие.

Где в определении блока let то, с чем сопоставляется "образец"? Без этого не понятно, с чем сопоставление.

>> То есть есть некий образец, и есть данные. Если они каким-то образом
>> подходят под образец, значит сопоставление происходит успешно, иначе рассматривается
>> другой образец (если он есть).
> Так работает match, в котором могут быть указаны несколько паттернов и они
> в совокупности должны покрыть все варианты. В let указывается только один
> паттерн, поэтому только он и должен покрыть все варианты. Ну либо
> не все, тогда нужно использовать let else.

Да, несколько паттернов - это основа паттернматчинга, без них в общем случае сопоставление с образцом не имеет смысла как вычислительная конструкция, теряет полноту по Тьюрингу. Получается то, что обычно называли "макрос". В данном случае, возможно, правильнее переводить как "шаблон", что бы не путалось с полноценным match.

>> Когда вместо имени подставятся "сопоставленное" в некоем определении выражение, это называется
>> "подстановка". В Си так происходит с макросами.
> В Rust нет никакой "подстановки", а есть pattern matching в let: https://doc.rust-lang.org/book/ch18-01-all-the-places-for-pa...

Я так понял, что в Rust есть своя особая терминология для принятых в других ЯП вещей. Что бы быть непохожим на них, или что бы не находить общий язык - это пока не понял.

Ответить | Правка | К родителю #559 | Наверх | Cообщить модератору

565. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от freecoder (ok), 25-Июн-24, 10:53 
> С точки зрения кого? Я это утверждаю, как писавший когда-то препроцессор Си.
> Полагаю, имею некое право говорить за программистов на Си, хотя бы
> некоторых. Понятно, что возможности у макросов существенно беднее. Потому и "похоже",
> а не "это он и есть".

Суть макроса в том, что он задаёт некий шаблон, который заменяется препроцессором на код, представленный в определении макроса. Здесь же нет никакой замены. Тем более текстовой, как реализованы макросы в Си. В Rust тоже есть макросы, но в отличии от сишных они работают на уровне AST.

> Где в определении блока let то, с чем сопоставляется "образец"? Без этого
> не понятно, с чем сопоставление.


let PATTERN = EXPRESSION;

> Да, несколько паттернов - это основа паттернматчинга, без них в общем случае
> сопоставление с образцом не имеет смысла как вычислительная конструкция, теряет полноту
> по Тьюрингу.


match foo() {
    (first, _) => println!("{first}"),
}

Ну и где здесь "потеря полноты по Тьюрингу"?

> Я так понял, что в Rust есть своя особая терминология для принятых
> в других ЯП вещей. Что бы быть непохожим на них, или
> что бы не находить общий язык - это пока не понял.

Ахахах! )))
Ну да, ну да. Просто имейте смелость признать, что вы были не правы. Или высокомерие и самолюбие не позволяют? )

Ответить | Правка | К родителю #562 | Наверх | Cообщить модератору

568. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  –1 +/
Сообщение от n00by (ok), 25-Июн-24, 11:40 
>> С точки зрения кого? Я это утверждаю, как писавший когда-то препроцессор Си.
>> Полагаю, имею некое право говорить за программистов на Си, хотя бы
>> некоторых. Понятно, что возможности у макросов существенно беднее. Потому и "похоже",
>> а не "это он и есть".
> Суть макроса в том, что он задаёт некий шаблон, который заменяется препроцессором
> на код, представленный в определении макроса. Здесь же нет никакой замены.
> Тем более текстовой, как реализованы макросы в Си. В Rust тоже
> есть макросы, но в отличии от сишных они работают на уровне
> AST.

Если следовать логике ("заменяется препроцессором"), получается, что в Rust нет никаких макросов. Надеюсь, понятно объяснил?

>> Где в определении блока let то, с чем сопоставляется "образец"? Без этого
>> не понятно, с чем сопоставление.
>

 
> let PATTERN = EXPRESSION;
>

Образец (которого нет в let) где-то в другом месте исходника магически "сопоставляется" с PATTERN, после чего на место PATTERN проставляется EXPRESSION? Это называется подстановка. Примерно так и происходит "раскрытие макросов".

>> Да, несколько паттернов - это основа паттернматчинга, без них в общем случае
>> сопоставление с образцом не имеет смысла как вычислительная конструкция, теряет полноту
>> по Тьюрингу.
>

 
> match foo() {
>     (first, _) => println!("{first}"),
> }
>

> Ну и где здесь "потеря полноты по Тьюрингу"?

Например, в том месте, где отсутствует цикл.

>> Я так понял, что в Rust есть своя особая терминология для принятых
>> в других ЯП вещей. Что бы быть непохожим на них, или
>> что бы не находить общий язык - это пока не понял.
> Ахахах! )))
> Ну да, ну да. Просто имейте смелость признать, что вы были не
> правы. Или высокомерие и самолюбие не позволяют? )

Я пока не понял, в чём я был не прав. Неужели в выражении "у меня сложилось впечатление"? Если такое же впечатление сложилось не только у меня, хочется знать, у кого ещё.

Ответить | Правка | К родителю #565 | Наверх | Cообщить модератору

538. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от freecoder (ok), 21-Июн-24, 09:35 
Вот пример с более сложным выражением и паттерном, в котором, однако, точно также вводится новое имя sum:

struct Ops {
    sum: i32,
    mul: i32,
}

let (_, _, Ops { sum, .. }) = {
    let a = 1;
    let b = 2;
    (a, b, Ops { sum: a + b, mul: a * b })
};

https://play.rust-lang.org/?version=stable&mode=debug&editio...

Ответить | Правка | К родителю #534 | Наверх | Cообщить модератору

542. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 22-Июн-24, 18:22 
>[оверквотинг удален]
>     mul: i32,
> }
> let (_, _, Ops { sum, .. }) = {
>     let a = 1;
>     let b = 2;
>     (a, b, Ops { sum: a + b,
> mul: a * b })
> };
>
> https://play.rust-lang.org/?version=stable&mode=debug&editio...

Довольно многословная запись для конструктора.

struct Ops {
  int32_t sum;
  int32_t mul;
  Ops() { auto a = 1, b = 2; sum = a + b; }
};

https://godbolt.org/z/Ys58Y1oYc

Ответить | Правка | К родителю #538 | Наверх | Cообщить модератору

557. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от freecoder (ok), 23-Июн-24, 11:50 
> Довольно многословная запись для конструктора.

Потому что это не конструктор. В Rust нет конструкторов как специальных методов структуры. Если нужно, то пользователь может создать сам подобный метод, который вернёт экземпляр структуры, его условно можно назвать "конструктором".

Ответить | Правка | К родителю #542 | Наверх | Cообщить модератору

561. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 24-Июн-24, 20:05 
>> Довольно многословная запись для конструктора.
> Потому что это не конструктор. В Rust нет конструкторов как специальных методов
> структуры. Если нужно, то пользователь может создать сам подобный метод, который
> вернёт экземпляр структуры, его условно можно назвать "конструктором".

Понятно, что нет конструкторов, потому и приходится применять вот такое, или реализовать "фабрику". Конструктор + деструктор в Си++ ведь нужны, что бы работало RAII, гарантирующее "безопасное" освобождение ресурсов. А тут другие методы.

Ответить | Правка | К родителю #557 | Наверх | Cообщить модератору

564. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от freecoder (ok), 25-Июн-24, 10:33 
> Понятно, что нет конструкторов, потому и приходится применять вот такое, или реализовать
> "фабрику". Конструктор + деструктор в Си++ ведь нужны, что бы работало
> RAII, гарантирующее "безопасное" освобождение ресурсов. А тут другие методы.

В Rust повсеместно используется RAII. Управление ресурсами на основе владения (Ownership Based Resource Management, OBRM) - по-сути это и есть RAII.

Ответить | Правка | К родителю #561 | Наверх | Cообщить модератору

567. "Выпуск Rust 1.79. Создан консорциум для разработки высоконад..."  +/
Сообщение от n00by (ok), 25-Июн-24, 11:26 
>> Понятно, что нет конструкторов, потому и приходится применять вот такое, или реализовать
>> "фабрику". Конструктор + деструктор в Си++ ведь нужны, что бы работало
>> RAII, гарантирующее "безопасное" освобождение ресурсов. А тут другие методы.
> В Rust повсеместно используется RAII. Управление ресурсами на основе владения (Ownership
> Based Resource Management, OBRM) - по-сути это и есть RAII.

Я не вполне понял. В Rust повсеместно используется OBRM, но хочется назвать это RAII? Или RAII в Си++ даёт право говорить "у нас есть OBRM из Rust"?

Ответить | Правка | К родителю #564 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру