The OpenNET Project / Index page

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



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

Оглавление

Доступен язык программирования Rust 1.8, opennews (?), 15-Апр-16, (0) [смотреть все]

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


4. "Доступен язык программирования Rust 1.8"  +2 +/
Сообщение от Mandoremail (?), 15-Апр-16, 12:07 
Зачем они перегрузку операторов ввели... Это же код запутывает так, что потом не найти где это было перекрыто
Ответить | Правка | Наверх | Cообщить модератору

5. "Доступен язык программирования Rust 1.8"  +/
Сообщение от Futu (?), 15-Апр-16, 12:15 
Чем он запутывает? Сложить два числа 1 + 2. Сложить два вектора vec![1, 2] + vec![3, 4, 5];
Ответить | Правка | Наверх | Cообщить модератору

10. "Доступен язык программирования Rust 1.8"  +/
Сообщение от freehckemail (ok), 15-Апр-16, 12:47 
Тем, что перегрузка операторов - это нарушение системы типов.

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

Во-вторых это делает реализацию системы вывода типов практически невозможной.

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

11. "Доступен язык программирования Rust 1.8"  +/
Сообщение от iZENemail (ok), 15-Апр-16, 13:02 
> перегрузка операторов - это нарушение системы типов.
> Во-вторых это делает реализацию системы вывода типов практически невозможной.

Только в случае с модной "утиной" типизацией. И то - под вопросом "почему ж нет?".

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

17. "Доступен язык программирования Rust 1.8"  –3 +/
Сообщение от Fyfyfy (?), 15-Апр-16, 13:59 
В например Swift решены все проблемы с "программист уже не сможет быть уверен в том, какой именно экземпляр функции, реализующей оператор, будет вызван". Так что это проблемы реализации.
Ответить | Правка | К родителю #10 | Наверх | Cообщить модератору

25. "Доступен язык программирования Rust 1.8"  +/
Сообщение от Crazy Alex (ok), 15-Апр-16, 15:43 
То-то в плюсах типы выводятся. А не уверен, что вызывается - спроси IDE.
Ответить | Правка | К родителю #10 | Наверх | Cообщить модератору

60. "Доступен язык программирования Rust 1.8"  +/
Сообщение от freehckemail (ok), 16-Апр-16, 11:06 
> То-то в плюсах типы выводятся. А не уверен, что вызывается - спроси IDE.

В том-то и дело, что не выводятся. Программист всё ещё обязан указывать типы параметров при определении функций. Всё, что там сделано для вывода типов - это возможность в некоторых исключительных случаях автоматически предположить, какое значение функция возвращает. То же самое и в Scala, например. И именуют они это "выводом типов", однако до тех пор, пока у них не будет нормального Хиндли-Милнера, говорить не о чем.

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

30. "Доступен язык программирования Rust 1.8"  +/
Сообщение от Аноним (-), 15-Апр-16, 16:58 
Программист может быть уверен, что будет вызван метод реализации трейта для типа, к экземплярам которого применён оператор.
А с точки зрения вывода типов оператор не отличается от любой другой функции.
Ответить | Правка | К родителю #10 | Наверх | Cообщить модератору

61. "Доступен язык программирования Rust 1.8"  +/
Сообщение от freehckemail (ok), 16-Апр-16, 11:19 
> Программист может быть уверен, что будет вызван метод реализации трейта для типа, к экземплярам которого применён оператор.

Да, да, да. И в конце концов получается, что трём переменным, принадлежащим одному классу, подмешали разные трейты. И поэтому один и тот же метод у этих трёх объектов выполняет разные вещи, хотя выглядят вызовы абсолютно одинакого.

> А с точки зрения вывода типов оператор не отличается от любой другой функции.

Не любой оператор. Вот and или or Вы в виде функции не сможете представить.

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

39. "Доступен язык программирования Rust 1.8"  +1 +/
Сообщение от Аноним (-), 15-Апр-16, 19:54 
компилятор в RUSTe один из самых жестких, с которыми я работал.
например для     vec![1, 2] + vec![3, 4, 5];
Т.е развернув синтак.й сахар компилер увидит что складываются два инстанса структуры (Vec<i32>), с реализованной перегрузкой операторов сложения и сделает конкат, в чем проблема? т.е всё будет проверенно на этапе компиляции
Ответить | Правка | К родителю #10 | Наверх | Cообщить модератору

47. "Доступен язык программирования Rust 1.8"  +/
Сообщение от Аноним (-), 15-Апр-16, 21:21 
>> vec![1, 2] + vec![3, 4, 5]

С каких пор тип Vec стал реализовывать trait Add?

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

48. "Доступен язык программирования Rust 1.8"  +1 +/
Сообщение от Аноним (-), 15-Апр-16, 21:34 
Если проблемы с фантазией, представь что он имплементит под Add конкатенацию
Ответить | Правка | Наверх | Cообщить модератору

100. "Доступен язык программирования Rust 1.8"  –1 +/
Сообщение от ram_scan (?), 18-Апр-16, 20:48 
> Если проблемы с фантазией, представь что он имплементит под Add конкатенацию

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

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

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

103. "Доступен язык программирования Rust 1.8"  +/
Сообщение от Аноним (-), 19-Апр-16, 20:48 
А что если ты "с разбегу" не помнишь "что у конкретного типа делает метод doIncrement?",
т.е что же он конкретно делает внутри, не понятно и по очевидной логике нужно пойти в исходник и посмотреть!

Точно так же в RUST можно в модуле откуда пришла такая-то структура(тип/класс), посмотреть в исходнике где у него имплементится AddAssign и посмотреть саму функциональность метода:

impl AddAssign for Foo {
    fn add_assign(&mut self, _rhs: Foo) {
    ...

http://doc.rust-lang.org/nightly/std/ops/trait.AddAssign.html

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

62. "Доступен язык программирования Rust 1.8"  –4 +/
Сообщение от freehckemail (ok), 16-Апр-16, 11:39 
Да, компилятор-то увидит. Однако вывод типов нужен прежде всего программисту, а не компилатору.

Вот я пишу например:
# let add1 x = x + 1;;

И когда я смотрю на это определение, я точно знаю, что add1 - это функция int -> int, потому что функция (+) имеет именно такой тип. И я уверен по этой же самой причине, что x - это int, потому что параметр иного типа не может быть передан в (+).

А если функция (+) может быть перегружена, то я ни в чём не могу быть уверен, и чтобы не ошибиться, мне в каждом конкретном случае использования add1, получается, придётся либо компилировать программу, чтобы посмотреть, всё ли корректно работает, либо прибегать к помощи специализированной IDE (а я могу, вообще говоря, хотеть работать в привычном мне текстовом редакторе).

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

66. "Доступен язык программирования Rust 1.8"  +2 +/
Сообщение от Аноним (-), 16-Апр-16, 12:40 
ты и сейчас в vim-e можешь посмотреть что же всё таки имплементит конкретная структура, с которой ты работаешь.

это опять же мне напоминает: почему же некоторое доверяют реализации метода, у которого и название порой не отражает всю суть его действия (т.е они "хотят проверить" метод/его реализацию), и не хотят проверять реализацию метода перегрузки оператора для конкретной структуры!? в чем разница?

http://www.opennet.ru/openforum/vsluhforumID3/107586.html#42
http://www.opennet.ru/openforum/vsluhforumID3/107586.html#59

struct Point {
    x: i32,
    y: i32,
}

impl Add for Point {
    type Output = Point;

    fn add(self, other: Point) -> Point {
        Point {x: self.x + other.x, y: self.y + other.y}
    }
...

Point {x: 1, y: 0} + Point {x: 2, y: 3}

здесь всё с примерами:
https://doc.rust-lang.org/nightly/std/ops/

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

69. "Доступен язык программирования Rust 1.8"  +/
Сообщение от Аноним (-), 16-Апр-16, 14:19 
Что бы тебе было яснее, по поводу твоего страха о изменении поведения сложения примитивных типов, то в руст такое невозможно:

ссылка на пример play.rust-lang.org:
http://is.gd/hZuJL3
https://doc.rust-lang.org/error-index.html#E0117

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

А про твое утверждение что что бы проверить поведение при перегрузке тебе нужно что-то компилировать, ты опять же ошибаешься, ты, опять же в vim-e/emacs/ручками в файле/ можешь посмотреть ДО КОМПИЛЯЦИИ реализацию перегрузки оператора у конкретной структуры (точно так же как если бы это был метод)!

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

79. "Доступен язык программирования Rust 1.8"  –4 +/
Сообщение от freehckemail (ok), 17-Апр-16, 09:57 
> Что бы тебе было яснее

Хамить заканчивайте.

> по поводу твоего страха о изменении поведения сложения *примитивных* типов

Когда это он у меня появился? Я-то почему не в курсе?

> Если же это не примтив, то ты уже должен понимать как работает такая-то структура!

Ну вот и начинается, о чём я и говорил. Вот стоит у тебя "a + b". Обе переменные были получены как результат, возвращённый из другой функции. Короче, на выяснение типа руками уйдёт много времени. Если допустить, что "+" может быть перегружен, то какую именно реализацию ты должен посмотреть?

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

Да что вы прицепились к этому вашему любимому различию между именованием функций буквами и мат.символами? Об этом не было речи вообще. И всё подряд методами называете зачем-то. ООП - это не весь мир. И перегрузка операторов работает не только для объектов, даже в том же C++.

> А про твое утверждение что что бы проверить поведение при перегрузке тебе
> нужно что-то компилировать, ты опять же ошибаешься, ты, опять же в
> vim-e/emacs/ручками в файле/ можешь посмотреть ДО КОМПИЛЯЦИИ реализацию перегрузки оператора
> у конкретной структуры (точно так же как если бы это был
> метод)!

В Emacs и Vim встроены синтаксические анализаторы, так что это считай полноценные IDE.
Но вот... Ручками в файле? Ты серьёзно? В случае перегрузки оператора, как в вышеописанном примере, не поймёшь, где смотреть, потратишь много времени.

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

82. "Доступен язык программирования Rust 1.8"  +3 +/
Сообщение от Аноним (-), 17-Апр-16, 15:33 
"хамство" - это видимо попытка объяснить оппоненту который уперся в своих домыслах, без конкретных аргументов, и даже не помнит что сам говорил/писал ранее:

>>freehck: А если функция (+) может быть перегружена, то я ни в чём не могу быть уверен, и чтобы не ошибиться, мне в каждом конкретном случае использования add1, получается, придётся либо компилировать программу, чтобы посмотреть, всё ли корректно работает, либо прибегать к помощи специализированной IDE (а я могу, вообще говоря, хотеть работать в привычном мне текстовом редакторе).
>>freehck: В Emacs и Vim встроены синтаксические анализаторы, так что это считай полноценные IDE.
>>freehck: Но вот... Ручками в файле? Ты серьёзно?

Тут видимо было бы лишне продолжать что-то объяснять... текстовый редактор без "синтаксического анализатора", в котором оппонент хочет работать - windows notepad.exe ?
Думаю.. очень показательно будет то как Вы смотрите реализации методов/функций сторонних классов/модулей в вашем "текстовом редакторе"?

Отвечая на вопрос, да, я вполне серьезно, если требуется найти имплементацию перегрузки оператора для структуры(класса) в RUST, это можно сделать в одну строку через find/grep  "impl Add for Point", соответственно будет видны аргументы и возвращаемый тип:

http://www.opennet.ru/openforum/vsluhforumID3/107586.html#66

>>> по поводу твоего страха о изменении поведения сложения *примитивных* типов
>>>freehck: Когда это он у меня появился? Я-то почему не в курсе?
>>>freehck: А если функция (+) может быть перегружена, то я ни в чём не могу быть уверен
>>> и не важно, совершается ли какое-либо действие через метод или перегруженный оператор!
>>>freehck: Да что вы прицепились к этому вашему любимому различию между именованием функций буквами и мат.символами? Об этом не было речи вообще. И всё подряд методами называете зачем-то. ООП - это не весь мир. И перегрузка операторов работает не только для объектов, даже в том же C++.

Тут оппонент видимо уже настолько ушел в спор, что забыл что обсуждается. Обсуждается подход реализованный в RUST, и если это не пустой разговор, хотелось бы обоснованных аргументов, на примере RUST, где по его утверждению "..программист уже не сможет быть уверен в том, какой именно экземпляр функции, реализующей оператор, будет вызван":

http://www.opennet.ru/openforum/vsluhforumID3/107586.html#66

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

85. "Доступен язык программирования Rust 1.8"  –1 +/
Сообщение от freehckemail (ok), 17-Апр-16, 17:45 
>>>> по поводу твоего страха о изменении поведения сложения *примитивных* типов
>>>>freehck: Когда это он у меня появился? Я-то почему не в курсе?
>>>>freehck: А если функция (+) может быть перегружена, то я ни в чём не могу быть уверен
>>>> и не важно, совершается ли какое-либо действие через метод или перегруженный оператор!
>>>>freehck: Да что вы прицепились к этому вашему любимому различию между именованием функций буквами и мат.символами? Об этом не было речи вообще. И всё подряд методами называете зачем-то. ООП - это не весь мир. И перегрузка операторов работает не только для объектов, даже в том же C++.
> Тут оппонент видимо уже настолько ушел в спор, что забыл что обсуждается.

А обсуждалось, вопреки далее Вами написанному, то, что возможность перегрузки операторов повлечёт известные проблемы языков с подобным подходом, такие как:
1) Усложнение понимания кода программистом,
2) Невозможность реализовать вывод типов.

Посмотрите выше по треду #4 и #10. Про подход Rust к этому делу - ни слова, вопреки тому, что Вы утверждаете:

> Обсуждается подход реализованный в RUST, и если это не пустой разговор,
> хотелось бы обоснованных аргументов, на примере RUST, где по его утверждению
> "..программист уже не сможет быть уверен в том, какой именно экземпляр
> функции, реализующей оператор, будет вызван":
> http://www.opennet.ru/openforum/vsluhforumID3/107586.html#66

Тем не менее, Ваш пример #66 - ни к селу, ни к городу, по очевидной причине: пока Вы в рамках одного проекта - грепайте на здоровье, но что Вы будете делать функцией, которая была перегружена в стороннем модуле? Что Вы тогда собственно грепать собрались? А ваша IDE может и не подсветить Вам, что, мол, Вы ошибочно применили не ту функцию, потому что шаблон перегруженной функции совпал с каким-то другим. В случае же, если перегрузки нет - Вы наверняка получаете ошибку на этапе компиляции (а скорее всего даже раньше: IDE может Вам и подсветить строчку, предупреждая о неправильном типе).

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

88. "Доступен язык программирования Rust 1.8"  –1 +/
Сообщение от Аноним (-), 17-Апр-16, 19:22 

>>>возможность перегрузки операторов повлечёт известные проблемы языков с подобным подходом, такие как:
>>>1) Усложнение понимания кода программистом

Наоборот. У меня на работе один из основных языков Java, и вот как-раз распутывать комбинации методов из BigDecimal add, multiply, subtract,.. кандидат номер один в улучшение читаемости, при наличии перегрузки операторов.

>>>2) Невозможность реализовать вывод типов.

Вообще не вижу связи, пример?

По поводу грепа, в Rust зависимости через cargo приходят в виде исходников, загрузив их, я точно так же могу погрепать реализацию используемого мной struct(класса) - операнда, и раз уж я буду использовать этот операнд я обязательно посмотрю его реализацию в исходном коде, и опять же не важно, будет там просто метод add или определена перегрузка оператора - я посмотрю signature реализации.

По вашему, если будет метод, и в языке не было бы перегрузки оператора, то Вы его не проверяете!? (конечно учитывая ваше желание работать в notepad.exe вполне может быть ваш стиль)

>>>А ваша IDE может и не подсветить Вам, что, мол, Вы ошибочно применили не ту функцию, потому что шаблон перегруженной функции совпал с каким-то другим. В случае же, если перегрузки нет - Вы наверняка получаете ошибку на этапе компиляции (а скорее всего даже раньше: IDE может Вам и подсветить строчку, предупреждая о неправильном типе).

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

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

89. "Доступен язык программирования Rust 1.8"  –3 +/
Сообщение от freehckemail (ok), 17-Апр-16, 20:01 
> Наоборот.

У. То есть Вы хотите ВЕСЬ этот разговор начать с самого НАЧАЛА?

> У меня на работе один из основных языков Java

Ах, неужели. Хотите верьте, хотите нет, но это кое-что объясняет.

>> 2) Невозможность реализовать вывод типов.
> Вообще не вижу связи, пример?

Вот Вы не видите, а Вам тут эту связь разные люди на разный ляд демонстрируют в разных тредах этой новости уже несколько дней как. :/
#62, #79, #35. Mandor тоже вон дело говорит. Что я Вам пытаюсь объяснить - не понимаю, Вы ж ни одного из нас так и не удосужились прочитать...

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

> По вашему, если будет метод, и в языке не было бы перегрузки оператора, то Вы его не проверяете!?

А я не понимаю, что Вы называете методом. Обычно вроде так называют интерфейсы взаимодействия с объектом, но при чём тут объекты, если мы тут говорим о перегрузке функций? Или вы так называете функции, обозначенные буквами? Или всё, что "не оператор"? Вы это слово пихаете вообще без контекста.

Или почему Вы так упорно говрите о "перегрузке оператора", хотя изначально планировалось обсудить перегрузку вообще? Операторы - они какие-то особенные?

Ну и как Вы хотите, чтобы с Вами вели беседу? Я наверое дурак, что вообще ввязался в этот разговор.

> (конечно учитывая ваше желание работать в notepad.exe вполне может быть ваш стиль)...
> Я вам рекомендую не заниматься пустой демагогией...

И хамите, хамите, хамите... Как Вы думаете, кому-нибудь нужны рекомендации человека, который даже не в состоянии понять позицию собеседника, но при этом постоянно норовит охаять его? Если кто-то и мог что-либо вынести из этого разговора для себя полезного - то это были Вы. И мне жаль, что я оказался недостаточно усерден.

PS: Мне стоило остановиться на сообщении #80, которое, судя по всему, осталось без должного внимания.

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

90. "Доступен язык программирования Rust 1.8"  +/
Сообщение от Аноним (-), 17-Апр-16, 20:31 
http://www.opennet.ru/openforum/vsluhforumID3/107586.html#4

Я ещё раз рекомендую посмотреть мои ссылки на документацию реализации этого в RUST, которые можно понять за час, если есть у вас конкретные примеры, покажите примеры где вывод типа будет не возможен!


И да #80 я прочитал, согласен что Аноним писал только про базовые операции с операторами с примитивами, потому и не продолжил.

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

91. "Доступен язык программирования Rust 1.8"  –2 +/
Сообщение от freehckemail (ok), 18-Апр-16, 00:01 
> http://www.opennet.ru/openforum/vsluhforumID3/107586.html#4
> Я ещё раз рекомендую посмотреть мои ссылки на документацию реализации этого в
> RUST, которые можно понять за час, если есть у вас конкретные
> примеры, покажите примеры где вывод типа будет не возможен!

Ох. Дорогой Аноним. Система типов Хиндли-Милнера не допускает перегрузки. Это - база. Ну о чём тут ещё говорить?

update: Первый же запрос в гугле:
https://books.google.ru/books?id=x30x9QfoRj8C&pg=PA15&lpg=PA...

> И да #80 я прочитал, согласен что Аноним писал только про базовые
> операции с операторами с примитивами, потому и не продолжил.

Это хорошо.

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

92. "Доступен язык программирования Rust 1.8"  +1 +/
Сообщение от Аноним (-), 18-Апр-16, 00:38 
И.. как это относится к RUST?
Ответить | Правка | К родителю #91 | Наверх | Cообщить модератору

93. "Доступен язык программирования Rust 1.8"  –3 +/
Сообщение от freehckemail (ok), 18-Апр-16, 00:54 
> И.. как это относится к RUST?

Так и относится. В Rust ввели возможность перегрузки. Кое-кто расстроился. Его спросили, а чем это плохо. Ответили, что усложняет семантику и нельзя вывод типов. Потом стали почему-то спорить, что вывод типов можно. Вот так сюда и пришли.

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

94. "Доступен язык программирования Rust 1.8"  +/
Сообщение от другой аноним (?), 18-Апр-16, 02:27 
> Ох. Дорогой Аноним. Система типов Хиндли-Милнера не допускает перегрузки. Это - база.

С другой стороны:
http://rextester.com/MVNH51780


--ghc 8.0.1 /opt/ghc/8.0.1/lib/ghc-8.0.0.20160127/
import Data.Char (ord, chr)
instance Num Char where
  a + b = 'Ъ'
  a * b = chr $ ord a + ord b    
main = print('x' + 'y', 'x' * 'y', 1 + 'y' + 'x' * 3)


('\1066','\241','\1066')

Т.е. хитро извращаться можно и в хаскелле, однако ориентироваться на таких вот хитрых рукопопов все же наверное не стоит.

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

98. "Доступен язык программирования Rust 1.8"  –1 +/
Сообщение от freehckemail (ok), 18-Апр-16, 12:10 
> Т.е. хитро извращаться можно и в хаскелле, однако ориентироваться на таких вот
> хитрых рукопопов все же наверное не стоит.

В Haskell числа имеют тип Num a. Вся соль в том, что тут мы доопределяем функцию, не изменяя её типа, потому что (+) в Haskell имеет тип Num a => a -> a -> a. Мы просто уточняем алгоритм для конкретного a. Тем расширение класса типов и отличается от перегрузки.

И вроде это могло бы привести к нарушению системы типов, однако Haskell тут спасает ленивость и то, что он чисто функциональный. Хотя, конечно, некоторого side-effect-а можно и тут добиться (если программист совсем уж исхитрился и замонадился по уши).

В Ocaml, кстати, тоже есть нечто подобное под названием variant types.

PS: Спасибо на добром слове, а то мне этот тред уже было противно продолжать.

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

83. "Доступен язык программирования Rust 1.8"  +2 +/
Сообщение от Аноним (-), 17-Апр-16, 16:41 
>> Если же это не примтив, то ты уже должен понимать как работает такая-то структура!
>>freehck: Ну вот и начинается, о чём я и говорил. Вот стоит у
>> тебя "a + b". Обе переменные были получены как результат, возвращённый
>> из другой функции. Короче, на выяснение типа руками уйдёт много времени.
>> Если допустить, что "+" может быть перегружен, то какую именно реализацию
>> ты должен посмотреть?

Если Вы, не знаете типов переменных аргументов сложения, и Вы работает в вашем "текстовом редакторе", то нужно изучить что же это за типы, совместимы ли они и какой выводится результат. Как и во многих других языках, в RUST, операнды разбираются слева на право учитывая operator-precedence, т.е, как и в случае если это был бы метод, и выражение было бы без перегруженного оператора: "a.add(b)", то потребовалось проверить как работает метод операнда "a", может ли он принимать аргументом операнд "b" и что же будет в итоге возвращено, - всё точно так же.

ссылка на онлайн интерпретатор:
http://is.gd/1tPUnI

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

84. "Доступен язык программирования Rust 1.8"  +1 +/
Сообщение от Led (ok), 17-Апр-16, 17:15 
> Вот стоит у
> тебя "a + b". Обе переменные были получены как результат, возвращённый
> из другой функции. Короче, на выяснение типа руками уйдёт много времени.
> Если допустить, что "+" может быть перегружен, то какую именно реализацию
> ты должен посмотреть?

Что в твоём "правильном языке без перегрузок" складывает "+"? float? double? int8? int16? int32? int64? int128? uint? ...

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

86. "Доступен язык программирования Rust 1.8"  –1 +/
Сообщение от freehckemail (ok), 17-Апр-16, 17:53 
> Что в твоём "правильном языке без перегрузок" складывает "+"? float? double? int8?
> int16? int32? int64? int128? uint? ...

Ну, могу на примере Ocaml:
Сложение int (63 бит): +
Сложение double (63 бит): +.
Сложение int64: Int64.add
Сложение int32: Int32.add

int128, uint, int16, int8 нету. Зато есть BigInt.

Не то, чтобы он был "правильным", у него свои тараканы есть тоже. Но как пример - почему бы и нет?

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

70. "Доступен язык программирования Rust 1.8"  +/
Сообщение от Аноним (-), 16-Апр-16, 14:33 
> И когда я смотрю на это определение, я точно знаю, что add1
> - это функция int -> int, потому что функция (+) имеет
> именно такой тип. И я уверен по этой же самой причине,
> что x - это int, потому что параметр иного типа не
> может быть передан в (+).

Угу, а на практике, в том же ocaml, начинаются танцы с бубном:
+. для float или
+/ для num.
еще ладно, но:
тот же "add" используется в int32, int64, nativeint, complex.
Да и никто не мешает пограмисту сделать свою, правильную версию
let add a b =  …


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

78. "Доступен язык программирования Rust 1.8"  –1 +/
Сообщение от freehckemail (ok), 17-Апр-16, 09:39 
>> И когда я смотрю на это определение, я точно знаю, что add1
>> - это функция int -> int, потому что функция (+) имеет
>> именно такой тип. И я уверен по этой же самой причине,
>> что x - это int, потому что параметр иного типа не
>> может быть передан в (+).
> Угу, а на практике, в том же ocaml, начинаются танцы с бубном:
> +. для float или
> +/ для num.

Правильно. Именно для того, чтобы я мог посмотреть не вооружённым IDE взглядом и понять, как оно работает наверняка. Поэтому, если тебе нужен оператор - для каждого типа будет свой суффикс. При этом Num - это в общем-то эзотерика. float-ом и int-ом всё как правило ограничивается.

> тот же "add" используется в int32, int64, nativeint, complex.
> Да и никто не мешает пограмисту сделать свою, правильную версию
> let add a b =  …

И вызываются они вот так: Int32.add, Int64.add... Такая логика: "имя пакета"."имя функции"
В случае определения нового add - a и b будут иметь те типы, которые задаст программист. Если уже была старая функция с таким именем, её значение будет забито новым связыванием.

Я только не понял, чем вы не довольны в Ocaml?

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

81. "Доступен язык программирования Rust 1.8"  +1 +/
Сообщение от Аноним (-), 17-Апр-16, 13:51 
> И вызываются они вот так: Int32.add, Int64.add... Такая логика: "имя пакета"."имя функции"

Или

 
open Int32;;
...
add foo bar;;

> В случае определения нового add - a и b будут иметь те
> типы, которые задаст программист. Если уже была старая функция с таким
> именем, её значение будет забито новым связыванием.

И я так и не понял, в чем (в этом случае) преймущество – смотреть-то все равно придется. Главное, что реализовать трейт для типа можно только по месту объявления оного. Т.е. главной "антифичи" "реализованно в глубинах кода и без полли^W IDE фиг найдешь" нет.
Да и сделать перегрузку для примитивов – не выйдет.

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

87. "Доступен язык программирования Rust 1.8"  +/
Сообщение от freehckemail (ok), 17-Апр-16, 17:57 
В том-то и дело, что не придётся. Если Вы открываете модуль, то новое определение add замещает старое, и если Вы попытаетесь передать ему параметры старых типов, то получите ошибку, о которой узнаете сразу же посредством IDE или на этапе компиляции. И Вы сразу же понимаете почему так произошло, ибо ближайшее определение - обязательно выше по тексту.

Но вообще, чтобы можно было даже без IDE обойтись, обычно такие модули просто не открывают, а везде пишут перед функцией имя модуля, к которому она относится. Многочисленные open в Ocaml - моветон.

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

43. "Доступен язык программирования Rust 1.8"  +3 +/
Сообщение от Uri (??), 15-Апр-16, 20:21 
Просто новое поколение боится математики. Поэтому они лучше будут писать Matrix.multiply(A, B.divided(C)), чем A*(B/C).

А от "+=" так вообще, наверное, писаются по ночам.

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

49. "Доступен язык программирования Rust 1.8"  +1 +/
Сообщение от Ананас (?), 15-Апр-16, 22:14 
Просто в любом поколении найдутся идиоты, приписывающие от себя левые мысли с квантором общности.
Ответить | Правка | Наверх | Cообщить модератору

52. "Доступен язык программирования Rust 1.8"  +2 +/
Сообщение от Аноним (-), 16-Апр-16, 01:05 
> Просто новое поколение боится математики.

Только давайте не путать

matrix4 = matrix1 + matrix2 * matrix3

и

interface = title + input + button(button::SEARCH) + (list << list::title /* сортировка по неубыванию заголовка, естественно */) + paginator

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

13. "Доступен язык программирования Rust 1.8"  +5 +/
Сообщение от Аноним (-), 15-Апр-16, 13:22 
Идиот? А вектора, комплексные числа, кватернионы и ещё бог весть что ты будешь бинарной функцией складывать? Ну удачи.
Ответить | Правка | К родителю #4 | Наверх | Cообщить модератору

21. "Доступен язык программирования Rust 1.8"  +10 +/
Сообщение от Аноним (-), 15-Апр-16, 14:52 
Чаю этому столику. Пусть джависты складывают методами, в нормальных языках должны быть перегружаемые операторы.
Ответить | Правка | Наверх | Cообщить модератору

63. "Доступен язык программирования Rust 1.8"  +1 +/
Сообщение от freehckemail (ok), 16-Апр-16, 11:45 
> Идиот? А вектора, комплексные числа, кватернионы и ещё бог весть что ты будешь бинарной функцией складывать? Ну удачи.

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

Когда у вас простой случай, типа a/b + c/d, действительно может показаться несколько неудобным записывать это в виде (+ (/ a b) (/ c d)). Но в случае научных расчётов с гиганскими формулами, этот способ сильно облегчает жизнь.

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

16. "Доступен язык программирования Rust 1.8"  +4 +/
Сообщение от Нимано (?), 15-Апр-16, 13:59 
> Зачем они перегрузку операторов ввели...

Уже пару лет как ввелу, горячий финский парень ;)

https://github.com/rust-lang/rfcs/blob/master/text/0953-op-a...
> We already let users overload the binary operations, letting them overload the assignment version is the next logical step.

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

32. "Доступен язык программирования Rust 1.8"  +1 +/
Сообщение от Аноним (-), 15-Апр-16, 19:13 
> Зачем они перегрузку операторов ввели... Это же код запутывает так, что потом не найти где это было перекрыто

Ну, компилятор же как-то находит. :)

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

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

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

40. "Доступен язык программирования Rust 1.8"  +8 +/
Сообщение от Аноним (-), 15-Апр-16, 19:57 
> Да и где вы такие проекты находите, где перегрузка операторов приводит прямо
> к невыносимым проблемам? Таких проектов наверное один на миллион. Какой-то глупый
> мифический страх, передающийся из уст в уста.

от джавистов)

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

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

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




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

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