Конкатенация строк

Поскольку никто так и не понял смысла моего комментария на гитхабе, поясню подробнее. Вот такой код никогда не компилировался ни в одном из известных мне Паскалей (хотя, конечно, я далеко не все его разновидности перепробовал):

 s1 := 'abc'  'xyz';
 s2 := 'abc'
       'xyz';

Только что перепроверил это в TP 7.0 (под DosBox), Virtual Pascal 2.1 и Free Pascal 2.x/3.x. – везде ругается на неверный синтакис. Хотя… может быть в Delphi это работает? Нет возможности сейчас быстро проверить (сам Delphi почти никогда в жизни не использовал).

@Admin :roll_eyes: Обратите внимание: речь в исходном вопросе вообще не шла о строках вида 'abc'#13#10'xyz' – это всегда и везде работало, просто Сергей был не в курсе, т.к. этот неочевидный момент тоже формально в справке у нас не описан, к сожалению.

Речь шла о неожиданной особенности: возможности конкатенации литерных строк, разделенных пробелами и/или написанными на разных строчках. Это уже не канонический синтаксис Паскаля. Подобная фича, конечно, существует в некоторых других ЯП (в основном, скриптовых), но там обычно в многострочных строках (multiline strings) не требуется явно писать коды CR/LF – они добавляются автоматом в каждой строчке, что куда проще и удобнее при необходимости впечатывать в код длинные тексты.

Поэтому данная возможность в целом хоть и не бесполезная, но в текущей реализации (если это вообще не случайный баг!) – довольно сомнительная, особенно разделение пробелами частей единой строки на одной строчке. Мне кажется, все это требует более критического осмысления и обсуждения.

Странный вопрос – в Справке и описать, т.к. никакого другого формального документа все равно нет и пока не предвидится. А откуда же еще начинающим брать информацию о правильном синтаксисе? Тем более о такой базовой вещи, как строки?

1 лайк

Скорее всего это баг

Турбо Паскаля?

Что тут обсуждать? Нормальная фича. Можно писать строку на нескольких строках, не соединяя плюсами.

Пожалуйста будьте точнее в формулировках. Я такого не утверждал. Речь шла не о #10, а о соединительных пробелах, которые в строку не добавляются.

Ваш вариант можно посмотреть по ссылке, для этого я её привёл (ссылка идёт прямо к вашему сообщению). А в моём варианте я показал где это может быть полезно.

Ну, в моём примере между строками есть переносы строки и пробелы-отступы и они все не добавляются, так что это в моём примере показано.

Я отвечал только Сергею.

Две строки подряд - да, это просто грязная реализация конкатенации с литералами-символами. Это надо убирать

1 лайк
1 лайк

Ещё раз, “+” работает на этапе выполнения, поэтому он медленнее. А конкатенация работает на этапе компиляции. Поэтому - не надо её убирать.

Я подправил название Issue до того как Вы ответили. Но, все-же, спасибо за замечание.

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

Убрал пример. Issue закрыто.

Конкатенация koнстантных строк происходит на этапе компиляции

1 лайк

А это всё вопросы оптимизации кода компилятором. Почему нельзя во время компиляции суммировать явные значения? Например вот такой код:

var a := 2 + 3;
var s := 'String' + 'String';

@ibond как раз только что сказал что это уже работает.

И - я проверил, таки да.
Ваш код из последнего ответа (если добавить writeln((a,s)) ) превращается в:

      PABCSystem.PABCSystem.Writeln((object) Tuple.Create<int, string>(5, "StringString"));

Ну так я не это имел ввиду. Речь идёт о том, что компилятор должен преобразовать это

var a := 2 + 3;
var s := 'String' + 'String';

В это

var a := 5;
var s := StringString;

В var a := 5; - не должен ни разу, если он не оптимизирующий. Может, если так разработчики сделают, но никак уж не должен.

Нет, таки про это. Именно это он и сделал. посмотрите внимательно в код. То что все промежуточные переменные убирает - это особенность IL, в нём просто нет разницы между этим:

var a := 5;
writeln(a);

И этим:

writeln(5)
1 лайк

А ничего, что компилятор должен оптимизировать код?

Это кто Вам сказал? Компилятор должен лишь если он называется оптимизирующим.