Re[11]: Перегрузка == героин?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 09.08.05 12:45
Оценка:
Здравствуйте, VladD2, Вы писали:

ANS>>Так и нужно было писать не "В том же SQL-е это сплошь и рядом.", а "В том же MS SQL Server-е это сплошь и рядом."

VD>Это не единственный сервер. Просто про него я точно помню.

Хороша ж конкатенация:
C:\...crosoft SQL Server\80\Tools\Binn>OSQL.EXE -U sa
Password:
1> SELECT 12 + '13';
2> go

 -----------
          25


Что касается не единственного сервера, то:

Database Language SQL 1992

4.2.2 Operations involving character strings

4.2.2.1 Operators that operate on character strings and return
character strings

<concatenation operator> is an operator, |, that returns the char-
acter string made by joining its character string operands in the
order given.

... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[12]: Перегрузка == героин?
От: vdimas Россия  
Дата: 09.08.05 12:47
Оценка:
Здравствуйте, VladD2, Вы писали:

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


Я думаю, что у этих товарищей понятие сдвига и ввода-вывода ассоциируются.

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

Правда, что весьма напрягало, так это то, что направление сдвига противоположно сигнатуре оператора, ибо преобладают протоколы с передачей начиная от младших бит.
Re[28]: No String Builder
От: Oyster Украина https://github.com/devoyster
Дата: 09.08.05 12:51
Оценка:
Здравствуйте, adontz, Вы писали:

A>А чем ты IL смотришь? Просто лично я гляжу ассемблерный код EXE'шника.


Ассемблерный код чего, простите? .NET-приложения компилируются в код на IL, который затем выполняется рантаймом. Вот этот IL я и смотрю Reflector-ом...
Re[23]: No String Builder
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 09.08.05 12:56
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Код:


O>
O>            string e = a + b + c + d;
O>

O>IL:

O>
O>      L_001c: call string string::Concat(string, string, string, string)
O>


Искуственный пример. Рассмотрим лучше:

string z = x + GenerateLongString()+y;


    aStringBuilder.append(x);
    GenerateLongString(aStringBuilder);
    aStringBuilder.append(y);
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[8]: Перегрузка == героин?
От: ansi  
Дата: 09.08.05 13:00
Оценка: 9 (1) +1
Здравствуйте, Кодёнок, Вы писали:

A>>Побитовое И?

Кё>Просто "И". Это у тебя привычка так о нем думать, потому что для целых оно побитовое.
А у тебя привычка так думать о +, потому что для целых оно означает сложение.


A>>В ПХП, например, — это точка. Но точка там, насколько я помню, не используется для доступа к членам класса, поэтому вполне допустима с этой точки зрения. В Си++ я не вижу символа более подходящего, чем +.

Кё>Это для строки. А для последовательности или матрицы появляется упомянутый Трурлем конфликт.

Сложение векторов и матриц — это вполне стандартная операция именно поэлементного сложения. И она законно обозначается символом +. Никаких конфликтов я не вижу.

Дело в том, что большинство языков моделируются именно под математику. Вот мы тут оперируем такими понятиями как массив, множество, последовательность, вектор, матрица, строка (string). На мой взгляд, картина следующая:

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

  2. Множество. Набор элементов, необязательно однотипных.
    Для множества существуют следующие основные математические операции:
    • Объединение. Математический знак не выражается в ASCII (похож на заглавную U). Наиболее уместным по смыслу считаю |.
    • Пересечение. Математический знак не выражается в ASCII (похож на перевернутую заглавную U). Наиболее уместным по смыслу считаю &.
    • Разность. Математический знак: \.
    • В случае, когда элементами являются числами, либо другие однотипные объекты к которым применимы следующие операции: поэлементное сложение, разность, произведение, частное (множество всех возможных сумм, разностей, произведений, частных элементов). Математический знак: +, -, / :, · (для удобства заменяется *).
    • Декартово произведение — не выражается в ASCII (похоже на латинскую x). Варианты приветсвуются.

  3. Вектор. Упорядоченный набор координат (по-моему, допустимы только числа) в n-мерном пространстве (либо в бесконечномерном).
    Для вектора существуют следующие основные математические операции:
    • Сумма (покомпонентное сложение). Математический знак: +.
    • Разность (покомпонентная разность, если не ошибаюсь). Математический знак: -.
    • Скалярное произведение. Математический знак: ·, "пустой символ", а так же скобки. Пока используется только первый, но для удобства заменяется *.
    • Векторное произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Варианты опять же приветсвуются.

  4. Матрица. Примерное определение сочинить не в силах почему-то . Ну, скажем табличка из чисел .
    Для матрицы существуют следующие основные математические операции:
    • Сумма (покомпонентное сложение). Математический знак: +.
    • Разность (покомпонентная разность). Математический знак: -.
    • Произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Заменяется на *.
    Такие операции, как транспонирование, обращение и пр. приходится выражать функциями (т.е. символьными именами).

  5. Последовательность. Упорядоченный набор однотипных объектов.
    Для последовательности существуют следующие основные математические операции:
    • Сумма (покомпонентное сложение). Математический знак: +.
    • Разность (покомпонентная разность). Математический знак: -.
    • Произведение. Математический знак: · (для удобства заменяется *).

  6. Строка. Упорядоченный набор символов. Нет аналога в математике.
    Для строки не существует математических операций (потому как арифметические операции над символами не имеют смысла). Но существует "родная" операция:
    • Конкатенация (слияние). Знак: +. Не коммутативно.

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

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

Кё>Вообще давайте отличать значение символа от своих привычек Амперсанд, обозначает союз "и" (et), который почти всегда (кроме битовых и логических операций, которые суть одно и то же) обозначает соединение оригинальных объектов вместо, а вот за плюсом стоит создание нового объекта.


Каждая операция порождает новый объект. Вопрос лишь в том КАКИМ ОБРАЗОМ.

Кё>Возможность вводить новые типы (ПОЛНОПРАВНЫЕ с встроенными) тоже увеличивает выразительность, и перегрузка операций просто обязана сопутствовать этой возможности. Иначе они не будут полноправными Автор стати выдумал какие-то мифические проблемы.


Согласен. Пошел спать
new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "Metallica — Fade To Black";
Re[29]: No String Builder
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.08.05 13:01
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Ассемблерный код чего, простите? .NET-приложения компилируются в код на IL, который затем выполняется рантаймом. Вот этот IL я и смотрю Reflector-ом...


Это как? C# Compiler генерирует IL. Но IL не выполняется, .Net Framework его сперва компилирует в машинный код (ассемблер просто более человечное его представление). Вот сгенерированный ассемблерный код я и глядел
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: Перегрузка == героин?
От: vdimas Россия  
Дата: 09.08.05 13:03
Оценка: +1
Здравствуйте, StanislavK, Вы писали:

SK>Напиши a.plus(b). Чем это хуже a + b никак понять не могу.


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

Я думаю, что в школе, ты бы не далеко ушел даже в начальной математике, если бы все детcво писал вместо A*(B+C) нечто вроде этого набора бреда: A.MULTIPLY(B.PLUS(C)). А как именно бы ты изучал тему раскрытия скобок и упрощения выражений в 4-м классе — вообще не понятно.

Для человека все еще критично такое понятие — как способность к восприятию информации. Соответственно, желательно так представлять информацию, что бы она воспринималась наилучшим образом.
Re[24]: No String Builder
От: Oyster Украина https://github.com/devoyster
Дата: 09.08.05 13:10
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Искуственный пример. Рассмотрим лучше:


ANS>
ANS>string z = x + GenerateLongString()+y;
ANS>

Тут будет то же самое (вызов string.Concat с тремя параметрами).

ANS>
ANS>    aStringBuilder.append(x);
ANS>    GenerateLongString(aStringBuilder);
ANS>    aStringBuilder.append(y);
ANS>
Re[30]: No String Builder
От: Oyster Украина https://github.com/devoyster
Дата: 09.08.05 13:10
Оценка: +1
Здравствуйте, adontz, Вы писали:

O>>Ассемблерный код чего, простите? .NET-приложения компилируются в код на IL, который затем выполняется рантаймом. Вот этот IL я и смотрю Reflector-ом...


A>Это как? C# Compiler генерирует IL. Но IL не выполняется, .Net Framework его сперва компилирует в машинный код (ассемблер просто более человечное его представление).


Это я и назвал "исполнение IL рантаймом". И ежу понятно, что неспециализированный процессор IL-код не проглотит.

A>Вот сгенерированный ассемблерный код я и глядел


С помошью чего глядели? Можно пример в студию (в котором много вызовов string.Concat вместо одного)?
Re[25]: No String Builder
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 09.08.05 13:20
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Здравствуйте, Andrei N.Sobchuck, Вы писали:


ANS>>Искуственный пример. Рассмотрим лучше:


ANS>>
ANS>>string z = x + GenerateLongString()+y;
ANS>>

O>Тут будет то же самое (вызов string.Concat с тремя параметрами).

Я к тому, что верхняя запись не преобразуется же в нижнюю. Которая, суть более оптимальній вариант.
ANS>>
ANS>>    aStringBuilder.append(x);
ANS>>    GenerateLongString(aStringBuilder);
ANS>>    aStringBuilder.append(y);
ANS>>
... << RSDN@Home 1.1.4 stable rev. 510>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[26]: No String Builder
От: Oyster Украина https://github.com/devoyster
Дата: 09.08.05 13:25
Оценка: +1
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Я к тому, что верхняя запись не преобразуется же в нижнюю. Которая, суть более оптимальній вариант.


А почему вы решили, что

// это то, во что преобразится string z = x + GenerateLongString()+y;
string z = string.Concat(x, GenerateLongString(), y);

будет оптимальнее, чем

ANS>>>
ANS>>>    aStringBuilder.append(x);
ANS>>>    GenerateLongString(aStringBuilder);
ANS>>>    aStringBuilder.append(y);
ANS>>>

? Я думаю, что это не так — внутри string.Concat наверняка тоже вполне грамотный код конкатенации строк.
Re[27]: Очепятка
От: Oyster Украина https://github.com/devoyster
Дата: 09.08.05 13:26
Оценка:
Читать так:

O>А почему вы решили, что


O>
O>// это то, во что преобразится string z = x + GenerateLongString()+y;
O>string z = string.Concat(x, GenerateLongString(), y);
O>

O>будет менее оптимально, чем

ANS>>>>
ANS>>>>    aStringBuilder.append(x);
ANS>>>>    GenerateLongString(aStringBuilder);
ANS>>>>    aStringBuilder.append(y);
ANS>>>>
Re[9]: Перегрузка == героин?
От: Трурль  
Дата: 09.08.05 13:30
Оценка: 5 (1)
Здравствуйте, ansi, Вы писали:

A>
  • Строка. Упорядоченный набор символов. Нет аналога в математике.
    A>Для строки не существует математических операций (потому как арифметические операции над символами не имеют смысла). Но существует "родная" операция:
    A>[list]
    A>
  • Конкатенация (слияние). Знак: +. Не коммутативно.

    В математике есть строки, а операция конкатенации обычно не обозначется (реже обозначется ||).
  • Re[31]: No String Builder
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 14:09
    Оценка: :)
    Здравствуйте, Oyster, Вы писали:

    A>>Вот сгенерированный ассемблерный код я и глядел

    O>С помошью чего глядели? Можно пример в студию (в котором много вызовов string.Concat вместо одного)?

    Debug\Windows\Disassembly. Для того чтобы поглядеть в релизе надо unmanaged debugging включить.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Re[32]: No String Builder
    От: Oyster Украина https://github.com/devoyster
    Дата: 09.08.05 14:24
    Оценка:
    Здравствуйте, adontz, Вы писали:

    O>>С помошью чего глядели? Можно пример в студию (в котором много вызовов string.Concat вместо одного)?


    A>Debug\Windows\Disassembly. Для того чтобы поглядеть в релизе надо unmanaged debugging включить.


    Ну вот. Увидел в Disassembly Window вот такой код:

    00000053  call        dword ptr ds:[003E50D0h]
    00000059  mov         dword ptr [ebp-1Ch],eax
    0000005c  call        dword ptr ds:[003E50D0h]
    00000062  mov         ebx,eax
    00000064  call        dword ptr ds:[003E50D0h]
    0000006a  mov         esi,eax
    0000006c  call        dword ptr ds:[003E50D0h]
    00000072  mov         edi,eax
    00000074  push        esi
    00000075  push        edi
    00000076  mov         edx,ebx
    00000078  mov         ecx,dword ptr [ebp-1Ch]
    0000007b  call        dword ptr ds:[79BF9DACh]
    00000081  mov         esi,eax
    00000083  mov         dword ptr [ebp-18h],esi

    Как видите, сначала идут 4 call к SomeFuncReturningString(), а потом только один call string.Concat. Выходит, вы неправы, уважаемый adontz?
    Re[9]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 09.08.05 14:35
    Оценка: 1 (1)
    Здравствуйте, ansi, Вы писали:

    A>[list=1]

    A>
  • Массив, список. Не моделирует ничего. Просто упорядоченный набор данных.
    A>Математические операции неприменимы. Но вроде как должна быть операция соединения. Как лучше ее обозначить... Наверное все-таки +.

    Чем лучше-то? Тем, что когда-то кто-то не подумав стал ее для этого использовать? Конкатенация объектов есть в математике (это суперпозиция функций, например) и она обладает определенными свойствами — например, ассоциативностью, нулевым элементом.

    A>
  • Вектор. Упорядоченный набор координат (по-моему, допустимы только числа) в n-мерном пространстве (либо в бесконечномерном).
    A>Для вектора существуют следующие основные математические операции:
    A>

      A>
    • Сумма (покомпонентное сложение). Математический знак: +.
      A>
    • Разность (покомпонентная разность, если не ошибаюсь). Математический знак: -.
      A>
    • Скалярное произведение. Математический знак: ·, "пустой символ", а так же скобки. Пока используется только первый, но для удобства заменяется *.
      A>
    • Векторное произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Варианты опять же приветсвуются.
      A>

    Вектор — это просто одномерный массив, а по простому отображение множества {1..N} в множество некоторых элементов. В твоем примере сразу виден порочный подход к перегрузке операторов, типичный для "свободного" С++ника. Арифметическое произведение использовано для скалярного произведения, чем сразу же нарушаются все мыслимые свойства операции *, которые мы вправе от нее ожидать. Использовать * для векторного произведения тоже нельзя, поскольку векторное произведение не коммутативно.

    A>
  • Матрица. Примерное определение сочинить не в силах почему-то . Ну, скажем табличка из чисел .
    A>Для матрицы существуют следующие основные математические операции:
    A>

      A>
    • Сумма (покомпонентное сложение). Математический знак: +.
      A>
    • Разность (покомпонентная разность). Математический знак: -.
      A>
    • Произведение. Математический знак: не выражается в ASCII (похоже на латинскую x). Заменяется на *.
      A>
    A>Такие операции, как транспонирование, обращение и пр. приходится выражать функциями (т.е. символьными именами).

    Матрица — это тоже самое, что вектор, только отображение будет из {1...N}*{1...M} -> A.
    Сумма и разность, естественно, будут работать, поскольку это группа. Но умножение не коммутативно, что легко может ввести в заблуждение.

    A>
  • Строка. Упорядоченный набор символов. Нет аналога в математике.
    A>Для строки не существует математических операций (потому как арифметические операции над символами не имеют смысла). Но существует "родная" операция:
    A>

      A>
    • Конкатенация (слияние). Знак: +. Не коммутативно.
      A>

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

    A>Почти все эти объекты — просто иное толкование массива, или списка (ну или двумерных в случае матрицы). Т.е. физически — это все одно и то же, но семантически — это разные вещи. Вопрос в том, что нужно вам?


    Нет, все это частные случаи отображений в случае теории множеств.

    A>Это стандартные обозначения, которые думаю знает каждый. Если надо нечто такое, что не попадает ни под один из этих объектов, то вся ответственность по выбору символов операций и их семантике полностью на вашей совести.


    В математике есть определенная иерархия структур типа полугруппа, группа, ассоциативная группа, полукольцо, кольцо и т.д. Все что встречается на практике неизбежно попадает под одно из определений, так что особо думать не надо.
  • Re[10]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 09.08.05 14:39
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Мне не мешает управление памятью. Наоборот — красивое решение содержит в себе элегантное управление памятью (вернее — жизненным циклом объектов, а не памятью как таковой) как неотъемлемую часть. И не надо сравнивать с математикой — любая формула из ВМ включает в себя элементарные операции сложения/умножения.


    Если бы каждый элегантно разрабатывал бы болты под себя, а не пользовался набором стандартных, то цивилизации не существовало бы. Конструктор может позволить себе не заниматься такими мелочами, а сконцентрироваться на машине в целом.
    Re[10]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 09.08.05 14:44
    Оценка: +1
    Здравствуйте, adontz, Вы писали:

    A>Ну так это проблема "обезьяны с гранатой". Если ты не доверяешь человеку настолько, чтобы подпускать его к Си++ — не подпускай. си++ язык требующий высокого профессионального уровня. Именно требующий. Это не VB и "среднестатистический ламерок не разобрался" неуместный упрёк. Си++ и не расчитан на то, чтобы в нём кто попало разбирался. Язык мощный но вместе с тем и сложный.


    Это вы намекаете, что С++ существует только для "посвященных" в тайные знания программистов, элиты мирого кодирования. Если так, что же на нем пишут все кому не лень?

    Q>>Ну использовать + для "сложения" строк вам же приходит в голову, хотя конкатенация строк к сложению никакого отношения не имеет.

    A>Это общепринятое обозначение. Оно применяется не только для std::string но и для многих других строк и не только в Си++. То что + применяется для конкатекации это даже если и недостаток, то уж точно не Си++'овый.

    Бредовое обозначение, и то, что оно почему-то употребляется в С++, меня не волнует.
    Re[6]: Перегрузка == героин?
    От: Quintanar Россия  
    Дата: 09.08.05 14:47
    Оценка: +2
    Здравствуйте, VladD2, Вы писали:

    VD>Есть такая штука — практика. И она показывает, что никаких проблем перегрузка не вызывает. На практике никто не кидается перегружать все какие можно операторы для все попавшихся под руку типов. Те кто может навалять дурака просто недодумываются применить это средство.


    Никаких доказательств этим утверждениям нет, поэтому стоит убрать из рассмотрения.
    Re[11]: Перегрузка == героин?
    От: adontz Грузия http://adontz.wordpress.com/
    Дата: 09.08.05 14:54
    Оценка: +2
    Здравствуйте, Quintanar, Вы писали:

    A>>Ну так это проблема "обезьяны с гранатой". Если ты не доверяешь человеку настолько, чтобы подпускать его к Си++ — не подпускай. си++ язык требующий высокого профессионального уровня. Именно требующий. Это не VB и "среднестатистический ламерок не разобрался" неуместный упрёк. Си++ и не расчитан на то, чтобы в нём кто попало разбирался. Язык мощный но вместе с тем и сложный.


    Q>Это вы намекаете, что С++ существует только для "посвященных" в тайные знания программистов, элиты мирого кодирования. Если так, что же на нем пишут все кому не лень?


    Собственно а кто сказал, что на нём все кому не лень пишут? На Си++ пишет не так уж много людей. Вот на "Си с классами" огромное количество.

    A>>Это общепринятое обозначение. Оно применяется не только для std::string но и для многих других строк и не только в Си++. То что + применяется для конкатекации это даже если и недостаток, то уж точно не Си++'овый.

    Q>Бредовое обозначение, и то, что оно почему-то употребляется в С++, меня не волнует.

    Ну да. появилось обозначение не в Си++, язык его только перенял, но виноват Си++. Главное точно известны виноватые.
    A journey of a thousand miles must begin with a single step © Lau Tsu
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.