Автобоксинг в Джава вчера и сегодня (только для джавистов).

 
1 2 3

Mishka

модератор
★★★

Murkt> Я вообще запутался, чего вы там хотите с приоритетами, оставим эту ветку обсуждения :P

Ок.
Murkt> Хорошо, просто приведи пример, в котором умножение типа А на тип А и умножение типа Б на тип Б выполняются с разными приоритетами. Я с таким не сталкивался, и не могу придумать, кому может понадобиться такая ересь :D

  • в С. :P Иногда умножение, иногда разыменование указателя. Но ты всё ещё думаешь про то, что умножение и деление. А на самом деле полиморфизм и перегрузка имён (операторы тоже имеют имена) позволяют использовать те же имена для выполнения разных вещей.



Другой пример оператор ввода-вывода в поток и сдвиг влево-вправо на несколько бит.

code text
  1.  
  2. include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. ostream s;
  7.  
  8. s = cout << "Hello, world!" << endl
  9.  
  10. int i, j;
  11.  
  12. i = 25;
  13.  
  14. j = i << 2;


Подходит? Вызывает проблемы? :)

Murkt> Таки хочу пример.

Посмотри на VHDL — у нас был подобный на Алголе 68.

Murkt> В своём новом языке - меняйте на здоровье :) Они там тоже будут стандартные, но такие как вам будет удобно.

Ну так мы в программах на Алголе 68 и меняли. :) И не только мы.
 

Murkt

Pythoneer

Murkt>> Хорошо, просто приведи пример, в котором умножение типа А на тип А и умножение типа Б на тип Б выполняются с разными приоритетами. Я с таким не сталкивался, и не могу придумать, кому может понадобиться такая ересь :D
Mishka> * в С. :P Иногда умножение, иногда разыменование указателя.
В С можно переопределить операцию разыменования указателя?

Mishka> Но ты всё ещё думаешь про то, что умножение и деление. А на самом деле полиморфизм и перегрузка имён (операторы тоже имеют имена) позволяют использовать те же имена для выполнения разных вещей.
Я поразмышляю над этим.

Mishka> Другой пример оператор ввода-вывода в поток и сдвиг влево-вправо на несколько бит.
Mishka> Подходит? Вызывает проблемы? :)
У них разный приоритет? Если да, то подходит и проблем не вызывает :)
[team Їжачки - сумні падлюки]  

Mishka

модератор
★★★

Murkt> В С можно переопределить операцию разыменования указателя?

В С ничего нельзя переопределить. А в С++ — свободно. Как smart pointers делаются-то? В С++ нельзя переопределить 4 операции — те, которые выполняются статически. Выдержка из стандарта:

[quote]
13.5 Overloaded operators [over.oper]
1 A function declaration having one of the following operator-function-ids as its name declares an operator function. An operator function is said to implement the operator named in its operator-function-id.

operator-function-id:
operator operator
operator operator < template-argument-listopt >

operator: one of
new delete new[] delete[]
+ - * / % ˆ & | ˜

= < > += -= = /= %=


ˆ= &= |= << >> >>= <<= == !=
<= >= && || ++ — , -> ->
() []
[Note: the last two operators are function call (5.2.2) and subscripting (5.2.1). The operators new[], delete[], (), and [] are formed from more than one token. ]

2 Both the unary and binary forms of
+ - * &
can be overloaded.

3 The following operators cannot be overloaded:

. .* :: ?:

nor can the preprocessing symbols # and ## (clause 16).
[/quote]



Murkt> Я поразмышляю над этим.

Приятно, что заставил задуматься. :)

Murkt> У них разный приоритет? Если да, то подходит и проблем не вызывает :)


Нет, в С++ приоритет не разный — там его нельзя заменять.
4 Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified.53)


53) The precedence of operators is not directly specified, but it can be derived from the syntax.
 


It is not possible to change the precedence, grouping, or number of operands of operators.
 


Кстати, а знал ли ты про такие операторы языка С++, Как

Pointer-to-member operators — .* и ->* ? :F
 
+
-
edit
 

Mishka

модератор
★★★

Решил уточнить — разные приоритеты не в одной программе, а в разных. Т.е. в пределах единицы компиляции (независимой), приоритет определяется однажды на весь scope и для символа операции и остаётся неизменным.
 

Murkt

Pythoneer

Murkt>> В С можно переопределить операцию разыменования указателя?
Mishka> В С ничего нельзя переопределить. А в С++ — свободно. Как smart pointers делаются-то? В С++ нельзя переопределить 4 операции — те, которые выполняются статически. Выдержка из стандарта:
Mishka> Кстати, а знал ли ты про такие операторы языка С++, Как
Mishka> Pointer-to-member operators — .* и ->* ? :F
Нет, не знал. Я почему-то даже не задумывался, что разыменование указателя - это просто унарное "умножение". Но мне простительно - я С++ не знаю. Так, лабы в универе некоторые поделать, и всё. Правда, я предположил как эти операторы должны работать, спросил у знакомого - оказалось, что предположил правильно.

Murkt>> Я поразмышляю над этим.
Mishka> Приятно, что заставил задуматься. :)
Со мной это легко сделать - можно сказать о какой-нибудь не самой тривиальной штуке, над которой я ещё не думал :P

Murkt>> У них разный приоритет? Если да, то подходит и проблем не вызывает :)
Mishka> Нет, в С++ приоритет не разный — там его нельзя заменять.
Ну и слава Б-гу! Значит любые примеры из С++ не подходят к спору про переопределение порядка выполнения :F

Mishka> Решил уточнить — разные приоритеты не в одной программе, а в разных. Т.е. в пределах единицы компиляции (независимой), приоритет определяется однажды на весь scope и для символа операции и остаётся неизменным.
То есть он всё-таки определяется (в Алголе 68, например) для символа операции, вне зависимости от аргументов? Потому что то, что писал Балансер - я так понял, что он хотел бы, чтоб приоритет зависел от аргументов. К венгерской нотации предложил вернуться... :)
[team Їжачки - сумні падлюки]  
+
-
edit
 

Balancer

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

Нет, ты не понял :) К венгерской нотации я предложил вернуться тебе, чтобы ты мог в Питоне понять, что такое q = r % s :) То ли остаток от деления, то ли подстановка... :D
 
+
-
edit
 

Murkt

Pythoneer

Murkt>> я так понял, что он хотел бы, чтоб приоритет зависел от аргументов. К венгерской нотации предложил вернуться... :)
Balancer> Нет, ты не понял :) К венгерской нотации я предложил вернуться тебе, чтобы ты мог в Питоне понять, что такое q = r % s :) То ли остаток от деления, то ли подстановка... :D
А. Ну, я таки способен понять по окружающему коду, что за переменные и что за действие выполняется. А вот приоритет операции по окружающему коду понять нельзя :)
[team Їжачки - сумні падлюки]  

tarasv

опытный

Mishka> Решил уточнить — разные приоритеты не в одной программе, а в разных. Т.е. в пределах единицы компиляции (независимой), приоритет определяется однажды на весь scope и для символа операции и остаётся неизменным.

Вобщем прелестная штука эта перезагрузка операторов (но полноценная а не как в C++) - нужен новый язык, сели подумали и готово. Но насколько часть это надо и насколько много людей имеют достаточную для этого квалификацию, в том числе и в документировании собственных творений? Как по мне нечасто и народа такого мало. ИМХО именно по этому в жабе перезагрузки и нет - это не язык для написания своих языков, а значит нефиг ерундой заниматься.
А насчет плюсов, как по мне, использование перезагрузки операторов в C++ его авторами годится только как пример для учебника что в языке это свойство есть - << и >> так и не заменили полностью printf и scanf а значит изначальный дизайн просто никуда не годится. Может мне не везло но мне практически не попадались примеры хорошего дизайна на С++ с использованием перезагрузки операторов - все больше головоломку напоминает написанную чтобы автора не уволили, потому что найдти героев чтобы сопровождать такой код будет очень сложно.
 

yacc

старожил
★★☆
tarasv> Вобщем прелестная штука эта перезагрузка операторов (но полноценная а не как в C++) -
полноценная - это как? что переопределять надо? :)

tarasv>нужен новый язык, сели подумали и готово.
Спроси Мишку про Алгол-68... :)

tarasv>ИМХО именно по этому в жабе перезагрузки и нет - это не язык для написания своих языков, а значит нефиг ерундой заниматься.
Угу. Именно так. А Балансера можешь про Форт спросить... :)

tarasv> А насчет плюсов, как по мне, использование перезагрузки операторов в C++ его авторами годится только как пример для учебника что в языке это свойство есть - << и >> так и не заменили полностью printf и scanf а значит изначальный дизайн просто никуда не годится.
printf и scanf ( wprintf и wscanf если с юникодом работаешь ) иногда полезно чтобы обработать явно, а не через ловлю исключений и/или чтобы работать с форматированным вводом/выводом ( особенно на основе шаблонов ). Как правило это обертывается классом и в явном виде не используется - кроме как дергание методов этого класса. << и >> - более широкого класса оператор, а не только для работы с консольным вводом/выводом.

tarasv> Может мне не везло но мне практически не попадались примеры хорошего дизайна на С++ с использованием перезагрузки операторов - все больше головоломку напоминает написанную чтобы автора не уволили, потому что найдти героев чтобы сопровождать такой код будет очень сложно.
Смотря кто писал. :) Мне попадался очень красивый код. Но такое скорее в библиотеках требуется для описания набора базисных сущностей. Бизнес-код писать через постоянное переопределение операторов ИМХО - извращение. Вот действительно хрен потом разберешься :)
Вот это, надеюсь, все уже видели ( вообще-то старая штука ) http://sunsite.nus.edu.sg/pub/humour/prog-evolve.html ? :)
 

tarasv

опытный

yacc> полноценная - это как? что переопределять надо? :)

Для полного набора - приоритеты и арность.

tarasv>>нужен новый язык, сели подумали и готово.
yacc> Спроси Мишку про Алгол-68... :)

Вот именно Алгол-68 как образец того как надо делать а не прикручивать, как Страуструп?, понравившуюся фичу к уже существующему языку. Опять же ИМХО глубочайшее - Страуструп постоянно напирает на то что для решения сложных задач нужен сложный инструмент - вот он какой у нас С++ сложный получился, а вот мне кажется что сложность происходит совсем не от задач, а от того что "плюсы" вобще не проектировались как единое целое и многие вещи были просто пришпандорены. Сейчас похоже такой-же процесс начинается и с жабой.

tarasv>>ИМХО именно по этому в жабе перезагрузки и нет - это не язык для написания своих языков, а значит нефиг ерундой заниматься.
yacc> Угу. Именно так. А Балансера можешь про Форт спросить... :)

Ага значит я не одинок в таком мнении ;)

yacc> << и >> - более широкого класса оператор, а не только для работы с консольным вводом/выводом.

Я о том что использование переопределения операторов в случае с вводом выводом привело к ситуации что printf как жил так и живет хотя ИМХО если не гнаться ща примером для учебника то Stream Stream::out(type what) и Stream Stream::formatOut(char * format, ...) убивают его наповал чего с "более широкого класса операторами" << и >> достич так и не удалось.

yacc> Смотря кто писал. :)

Даже хорошие и грамотные люди иногда ошибки делают ;) . Например от спешки.

yacc> Мне попадался очень красивый код. Но такое скорее в библиотеках требуется для описания набора базисных сущностей. Бизнес-код писать через постоянное переопределение операторов ИМХО - извращение. Вот действительно хрен потом разберешься :)

А для библиотеки перезагрузка операторов самое то - и на выходе несколько другой язык - С++ там только для связки слов :D
 
Это сообщение редактировалось 12.12.2007 в 01:23
1 2 3

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru