Конкатенация строк
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 08.11.07 13:13
Оценка: :))) :))
Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).

Другие известные мне обозначения '.' и '||' достаточно нейтральны.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>

08.11.07 21:31: Перенесено модератором из 'О жизни' — туда, где сии высокоумные мысли обсуждать благополезнее — Кодт
Re: Конкатенация строк
От: ДимДимыч Украина http://klug.org.ua
Дата: 08.11.07 13:16
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'?


Предположение:
s = a + b + c;
strlen(s) == strlen(a) + strlen(b) + strlen(c);
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re: Конкатенация строк
От: Пётр Седов Россия  
Дата: 08.11.07 13:29
Оценка:
Здравствуйте, Mystic.
В Visual Basic-е конкатенация строк обозначается & (амперсанд). В Lua конкатенация строк обозначается .. (две точки).
Пётр Седов (ушёл с RSDN)
Re[2]: Конкатенация строк
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 08.11.07 13:35
Оценка: +1 :)))
Здравствуйте, Пётр Седов, Вы писали:

ПС>Здравствуйте, Mystic.

ПС>В Visual Basic-е конкатенация строк обозначается & (амперсанд). В Lua конкатенация строк обозначается .. (две точки).

Какой однако разброд и шатание...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Конкатенация строк
От: Пётр Седов Россия  
Дата: 08.11.07 14:33
Оценка: 14 (1)
Здравствуйте, Mystic, Вы писали:
M>Какой однако разброд и шатание...
Raphael Finkel в книге «Advanced Programming Language Design» пишет:

Chapter 9. Aggregates

9.1 Strings

9.1.1 Literals and Simple Operations

Another simple operation is concatenation, often represented by the overloaded operator + . (SNOBOL represents concatenation by an empty space operator, which is quite confusing, particularly since the same invisible operator also represents pattern matching!) In addition, a few languages, such as ABC, provide operators for string repetition ("ho" * 3 is "hohoho"), string length, and arcane operations such as finding the minimum character in a string.

9.1.6 SNOBOL
SNOBOL was developed by Ralph E. Griswold and others at Bell Telephone Laboratories around 1965 [Griswold 71]. It has a strange syntax, partially because it was developed before Algol-like syntax became popular. Spaces act as both the concatenation and the match operators.

Пётр Седов (ушёл с RSDN)
Re: Конкатенация строк
От: SergH Россия  
Дата: 08.11.07 18:39
Оценка: +1
Здравствуйте, Mystic, Вы писали:

M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).


M>Другие известные мне обозначения '.' и '||' достаточно нейтральны.


В Питоне строки складываются плюсом. Зато строку можно умножить на число — иногда очень удобно, например отступы делать.
Делай что должно, и будь что будет
Re: Конкатенация строк
От: nikov США http://www.linkedin.com/in/nikov
Дата: 08.11.07 18:53
Оценка: :)
Здравствуйте, Mystic, Вы писали:

M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+'


Потому что к одной строке добавляется другая
Re: Конкатенация строк
От: iZEN СССР  
Дата: 08.11.07 19:17
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).


Это из серии "меньшей неожиданности". Люди начинают учиться программировать, как правило, с Бэйсика.
Re: Конкатенация строк
От: Кодёнок  
Дата: 09.11.07 08:17
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).


M>Другие известные мне обозначения '.' и '||' достаточно нейтральны.


В языках, где об этом задумывались, такой проблемы нет. Например в хаскеле списки соединяются оператором ++ из другого класса типов.
Re[2]: Конкатенация строк
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 09.11.07 08:47
Оценка: :))) :)))
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Mystic, Вы писали:


M>>Я вот подумал, а почему конкатенация строк обозначается чимволом '+'


N>Потому что к одной строке добавляется другая


Задумался над умножением / делением строк в столбик...

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[2]: Конкатенация строк
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 09.11.07 08:48
Оценка:
Здравствуйте, iZEN, Вы писали:

ZEN>Это из серии "меньшей неожиданности".


Ну-ну. Как там на счет ожидаемой коммутативности "+"?

ЗЫ. В St для конкатенации любых коллекций используется "," (з.п.т.).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[3]: Конкатенация строк
От: Пётр Седов Россия  
Дата: 09.11.07 11:05
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Какой однако разброд и шатание...

В языке D конкатенация строк (и вообще массивов) обозначается ~ (тильда).

Programming in D for C Programmers:

String Concatenation

The D Way
D overloads the operators ~ and ~= for char and wchar arrays to mean concatenate and append, respectively:

char[] s1;
char[] s2;
char[] s;

s = s1 ~ s2;
s ~= "hello";


Arrays:

Array Concatenation

The binary operator ~ is the cat operator. It is used to concatenate arrays:

int[] a;
int[] b;
int[] c;

a = b ~ c; // Create an array from the concatenation of the
           // b and c arrays

Many languages overload the + operator to mean concatenation. This confusingly leads to, does:
"10" + 3

produce the number 13 or the string "103" as the result? It isn't obvious, and the language designers wind up carefully writing rules to disambiguate it — rules that get incorrectly implemented, overlooked, forgotten, and ignored. It's much better to have + mean addition, and a separate operator to be array concatenation.

Similarly, the ~= operator means append, as in:
a ~= b; // a becomes the concatenation of a and b

Concatenation always creates a copy of its operands, even if one of the operands is a 0 length array, so:
a = b;           // a refers to b
a = b ~ c[0..0]; // a refers to a copy of b


D Strings vs C++ Strings:

Concatenation Operator

C++ Strings are stuck with overloading existing operators. The obvious choice for concatenation is += and +. But someone just looking at the code will see + and think "addition". He'll have to look up the types (and types are frequently buried behind multiple typedef's) to see that it's a string type, and it's not adding strings but concatenating them.

Additionally, if one has an array of floats, is '+' overloaded to be the same as a vector addition, or an array concatenation?

In D, these problems are avoided by introducing a new binary operator ~ as the concatenation operator. It works with arrays (of which strings are a subset). ~= is the corresponding append operator. ~ on arrays of floats would concatenate them, + would imply a vector add. Adding a new operator makes it possible for orthogonality and consistency in the treatment of arrays. (In D, strings are simply arrays of characters, not a special type.)

Пётр Седов (ушёл с RSDN)
Re[2]: Конкатенация строк
От: LaptevVV Россия  
Дата: 09.11.07 11:38
Оценка:
Здравствуйте, iZEN, Вы писали:

ZEN>Это из серии "меньшей неожиданности". Люди начинают учиться программировать, как правило, с Бэйсика.

Нифигаааа!!!!
Я учился программировать — в восьмеричных кодах Минска-22...
Наверное поэтому я до сих пор не люблю Васик...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Конкатенация строк
От: Пётр Седов Россия  
Дата: 09.11.07 11:49
Оценка:
Здравствуйте, Пётр Седов, Вы писали:
ПС>
ПС>"10" + 3
ПС>

Кстати, в C++ так можно. Например:
#include <iostream>

int main()
{
  std::cout << "10" + 3;
  return 0;
}

Ни к чему хорошему (13 или "103") это не приведёт.
Пётр Седов (ушёл с RSDN)
Re[2]: Конкатенация строк
От: Кодт Россия  
Дата: 12.11.07 17:54
Оценка:
Здравствуйте, SergH, Вы писали:

SH>В Питоне строки складываются плюсом. Зато строку можно умножить на число — иногда очень удобно, например отступы делать.

И не только строки, а ещё и кортежи и списки.

Кстати, вот! Пример того, как сложение (пусть и некоммутативное) обобщается до умножения.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Конкатенация строк
От: _FRED_ Черногория
Дата: 13.11.07 21:30
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

M>>>Я вот подумал, а почему конкатенация строк обозначается чимволом '+'

N>>Потому что к одной строке добавляется другая
KV>Задумался над умножением / делением строк в столбик...

Раз уж строка почти всегда — массив (читай: вектор), то паркуа бы и нет
Help will always be given at Hogwarts to those who ask for it.
Re: Конкатенация строк
От: Сергей Мухин Россия  
Дата: 13.11.07 22:13
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Я вот подумал, а почему конкатенация строк обозначается чимволом '+' и никогда символом '*'? Хотя символ '*' более логичен. Множество строк с операцией конкатенации образуют моноид, а в нем рассматривается именно умножение. Далее, есть единичный элемент (пустая строка). Операция некоммутативна, но ассоциативна ('+' обозначается групповая операция в абелевых группах, в них же единица называется нулем).


M>Другие известные мне обозначения '.' и '||' достаточно нейтральны.


Случайно увидел тут переписку, Никто не отреагировал на слово "моноид". Видимо тут непонимание, как называется операция, и что такое 1. Что такое 0 (или 1) для нашего моноида понятно. А как назвать операцию — никого отношения не имеет. И очень странно, для чел, который оперирует такими понятиями, придираться к имени операции. Т.е. языки программирования это вам не математика! как хотим, так и называем. И нечего тут моноиды нам втюхивать.

поставлю смайлик, а то опять никто не поймет.
Нет поставлю два, а то вон тот еще не понял вроде.
---
С уважением,
Сергей Мухин
Re[2]: Конкатенация строк
От: Кодт Россия  
Дата: 14.11.07 15:07
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Случайно увидел тут переписку, Никто не отреагировал на слово "моноид". Видимо тут непонимание, как называется операция, и что такое 1. Что такое 0 (или 1) для нашего моноида понятно. А как назвать операцию — никого отношения не имеет. И очень странно, для чел, который оперирует такими понятиями, придираться к имени операции. Т.е. языки программирования это вам не математика! как хотим, так и называем. И нечего тут моноиды нам втюхивать.


А чё такого? Ну моноид?
Берём любимый язык для теоретизирования вокруг моноидов — Гофер Ну ладно, берём Хаскелл. Моноиды — воплощения класса MonadPlus, над которым определены mzero и mplus (а в Гофере синонимом mplus был — несложно догадаться — (++) ).
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Конкатенация строк
От: jazzer Россия Skype: enerjazzer
Дата: 14.11.07 16:22
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, SergH, Вы писали:


SH>>В Питоне строки складываются плюсом. Зато строку можно умножить на число — иногда очень удобно, например отступы делать.

К>И не только строки, а ещё и кортежи и списки.

К>Кстати, вот! Пример того, как сложение (пусть и некоммутативное) обобщается до умножения.

Ага, причем до коммутативного (в смысле что 3*"ho" и "ho"*3 — это одно и то же "hohoho")
Ну и домены разные получаются у операций.

P.S. Кстати, нет проблем в С++ определить оператор умножения для, скажем, std::string, как-нть так:
std::string operator*(const std::string& src, int i)
{
  std::string ret;
  ret.reserve( i*src.length() );
  while (i--) ret.append( src );
  return ret;
}

ну и для любого "стандартного" класса-последовательности (string, vector, list, deque etc):
template <class Container>
Container operator*(const Container& src, int i)
{
  Container ret;
  while (i--)
    ret.insert( ret.end(), src.begin(), src.end() );
  return ret;
}
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Конкатенация строк
От: Пётр Седов Россия  
Дата: 14.11.07 19:19
Оценка: 9 (2)
Здравствуйте, Пётр Седов, Вы писали:
ПС>SNOBOL represents concatenation by an empty space operator,
Кстати, в книге дракона (Ахо, Сети, Ульман) конкатенация строк (а также языков и регулярных выражений) тоже обозначается пустым местом (как умножение в математике):

Глава 3. Лексический анализ

3.3. Определение токенов

Строки и языки

Пустая строка, обозначаемая как ε, представляет собой специальную строку нулевой длины.

Если x и y — строки, то конкатенация строк x и y, которая записывается как xy, является строкой, сформированной путём дописывания y к x. Например, если x = dog, а y = house, то xy = doghouse. Пустая строка представляет собой единичный элемент по отношению к операции конкатенации, то есть для любой строки s справедливо соотношение sε = εs = s.

Если рассматривать конкатенацию как операцию «умножения», то можно определить операцию «возведения в степень» следующим образом. Определим, что , а для i > 0 определим как . Поскольку εs — просто s, то . Соответственно, , и так далее.

Также в C/C++ компилятор собирает соседние строковые литералы в один. Например:
printf("Hell" "o World!" "\n"); // компилятор соберёт в "Hello World!\n"

На основе этого в библиотеке MFC указывается сигнатура метода (список типов параметров).
afxdisp.h:

...
// parameter types: by value VTs
#define VTS_I2              "\x02"      // a 'short'
#define VTS_I4              "\x03"      // a 'long'
#define VTS_R4              "\x04"      // a 'float'
#define VTS_R8              "\x05"      // a 'double'
#define VTS_CY              "\x06"      // a 'CY' or 'CY*'
#define VTS_DATE            "\x07"      // a 'DATE'
#define VTS_WBSTR           "\x08"      // an 'LPCOLESTR'
#define VTS_DISPATCH        "\x09"      // an 'IDispatch*'
#define VTS_SCODE           "\x0A"      // an 'SCODE'
#define VTS_BOOL            "\x0B"      // a 'BOOL'
#define VTS_VARIANT         "\x0C"      // a 'const VARIANT&' or 'VARIANT*'
#define VTS_UNKNOWN         "\x0D"      // an 'IUnknown*'
...

viewhtml.cpp:

...
BEGIN_EVENTSINK_MAP(CHtmlView, CFormView)
  ...
  ON_EVENT(CHtmlView, AFX_IDW_PANE_FIRST, 105 /* CommandStateChange */, OnCommandStateChange, VTS_I4 VTS_BOOL)
  ...
END_EVENTSINK_MAP()
...
void CHtmlView::OnCommandStateChange(long lCommand, BOOL bEnable)
{
  ...
}
...

Пётр Седов (ушёл с RSDN)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.