Multiline String

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 7226
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Multiline String

Beitrag von Mathias »

Ich habe gerade ein neues Featues von FPC Trunk entdeckt, man kann mehr Zeilige Strings machen. Das Geflicke mit LineEnding oder #10 fällt weg.
Einziges Manko, JEDI kommt damit nicht zurecht.

Foilgender Code lässt sich in der Trunk ohne Probleme kompilieren:

Code: Alles auswählen

const
  s1 = `Lines1
Lines2
Lines2`;

var
  s2:String;
begin
  s2:=`Zeile 1
Zeile 2
Zeile 3`;

  writeln(s1);
  writeln(s2);
end.
Alternativ geht auch, aber damit kommt codetools nicht zurecht.

Code: Alles auswählen

  s3 := '''
Zeile 1
Zeile 2
Zeile 3
''';
Da vielfach die Frage wegen Multline Strings kam, stelle ich es hier vor.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Zvoni
Beiträge: 565
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Multiline String

Beitrag von Zvoni »

Ei pfui bäh

Wer ist denn auf diese glorreiche Idee gekommen, das sowas nützlich sein könnte?!?!?!

Alleine schon, dass man umdenken muss, "Backticks" zu verwenden (so lese ich zumindest dein Beispiel), oder die Single-Quotes zu escapen...

brrr....*schauder*

Mal ganz zu schweigen davon, dass wenn jemand so lange Strings hart im Code hat doch mMn sowieso schon was prinzipielles falsch macht
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7189
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Multiline String

Beitrag von af0815 »

Gibt es einen Compiler Schalter wo man das abdrehen kann ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

schoschy
Beiträge: 62
Registriert: Di 18. Okt 2022, 15:46

Re: Multiline String

Beitrag von schoschy »

af0815 hat geschrieben: Di 24. Feb 2026, 13:43 Gibt es einen Compiler Schalter wo man das abdrehen kann ?
Berechtigte Frage!

Linker Bildschirm IDE, rechter Chat.
Die frage warum ich die Chat-Nachricht nicht gesendet habe, beantwortet sich ab und an mit compilererror.

Wenn jetzt eine Zeichenfolge davon betroffen ist, findet man den fehler nur zufällig.

Code: Alles auswählen

SendToServer(`LOG
IN`);
e: code angepasst
Zuletzt geändert von schoschy am Di 24. Feb 2026, 14:06, insgesamt 1-mal geändert.

Benutzeravatar
Zvoni
Beiträge: 565
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Multiline String

Beitrag von Zvoni »

schoschy hat geschrieben: Di 24. Feb 2026, 13:57
af0815 hat geschrieben: Di 24. Feb 2026, 13:43 Gibt es einen Compiler Schalter wo man das abdrehen kann ?
Berechtigte Frage!

Linker Bildschirm IDE, rechter Chat.
Die frage warum ich die Chat-Nachricht nicht gesendet habe, beantwortet sich ab und an mit compilererror.

Wenn jetzt eine Zeichenfolge davon betroffen ist, findet man den fehler nur zufällig.

Code: Alles auswählen

SendToServer('LOG
IN');
So wie ich es verstehe, würde das sowieso nen Compiler-Fehler erzeugen.
Wie ich das Beispiel von Mathias verstehe, geht multiline nur per "Backtick", nicht mit einfachem Singlequote
Unbenannt.PNG
Unbenannt.PNG (70.99 KiB) 391 mal betrachtet
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

schoschy
Beiträge: 62
Registriert: Di 18. Okt 2022, 15:46

Re: Multiline String

Beitrag von schoschy »

Zvoni hat geschrieben: Di 24. Feb 2026, 13:59 So wie ich es verstehe, würde das sowieso nen Compiler-Fehler erzeugen.
Wie ich das Beispiel von Mathias verstehe, geht multiline nur per "Backtick", nicht mit einfachem Singlequote
Unbenannt.PNG
So hab ich das auch verstanden und direkt "falsch" vorgemacht :D

Mathias
Beiträge: 7226
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Multiline String

Beitrag von Mathias »

Wer ist denn auf diese glorreiche Idee gekommen, das sowas nützlich sein könnte?!?!?!
Wie man es nimmt ich finde es ein geniales Features.

Sowas sieht einfach grässlich aus und mit LineEnding noch schlimmer:

Code: Alles auswählen

const
  vertex_shader_text =
    '#version 330 core' + #10 +
    '' + #10 +
    'layout (location = 0) in vec4 vPosition;' + #10 +
    '' + #10 +
    'void main()' + #10 +
    '{' + #10 +
    '  gl_Position = vPosition;' + #10 +
    '}';
Sowas ist viel schöner, endlich mal saubere lesbare Shader.
Einzig der SynEdit nimmt leider die {} als Kommentare, ist sicher ein Bug, weil es noch nicht entdeckt wurde.

Code: Alles auswählen

  vertex_shader_text = `
    #version 330 core

    layout (location = 0) in vec4 vPosition;

    void main()
    {
      gl_Position = vPosition;
    }
`;
Wie ich das Beispiel von Mathias verstehe, geht multiline nur per "Backtick", nicht mit einfachem Singlequote
Oder mit den ''' aber dann hat Codetools Mühe.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

charlytango
Beiträge: 1236
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Multiline String

Beitrag von charlytango »

verschlimmbessern geht immer - das sieht so aus als ob man einen C-Programmierer an Pascal code arbeiten ließe und der ohne sein gewohntes Codebild nicht arbeiten kann

Mathias
Beiträge: 7226
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Multiline String

Beitrag von Mathias »

verschlimmbessern geht immer - das sieht so aus als ob man einen C-Programmierer an Pascal code arbeiten ließe und der ohne sein gewohntes Codebild nicht arbeiten kann
GSLS-Code ist nun mal C ähnlich.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7189
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Multiline String

Beitrag von af0815 »

schoschy hat geschrieben: Di 24. Feb 2026, 14:06
Zvoni hat geschrieben: Di 24. Feb 2026, 13:59 So wie ich es verstehe, würde das sowieso nen Compiler-Fehler erzeugen.
Wie ich das Beispiel von Mathias verstehe, geht multiline nur per "Backtick", nicht mit einfachem Singlequote
Unbenannt.PNG
So hab ich das auch verstanden und direkt "falsch" vorgemacht :D
Man soll dann auch noch Backtick und SInglequote auseianderhalten. Alter Schwede, so was erkennst du nie und ist somit Fehleranfällig, nur weil der "fremde" GSLS Kode nicht in Pascal passt.

Da ist das passender und man sieht das hier mit artfremden Code herumgewürgt wird

Code: Alles auswählen

const
  vertex_shader_text =
    '#version 330 core' + #10 +
    '' + #10 +
    'layout (location = 0) in vec4 vPosition;' + #10 +
    '' + #10 +
    'void main()' + #10 +
    '{' + #10 +
    '  gl_Position = vPosition;' + #10 +
    '}';
Das ist mit 1000 mal lieber. Mir ist sowas auch bei SQL lieber, wo ich jahrelang damit sichere und wartbare Applikationen geschaffen habe.

Oder bau das mit einem StringBuilder oder Stringlist zusammen.

Edit: Gibts scheinbar seit 2019, zumindest habe ich da DIskussionen darüber gefunden
Die muss ich mir noch ansehen

Code: Alles auswählen

{$modeswitch MultiLineStrings}
{$MultiLineStringTrimLeft Auto}
Hier gibts mehr dazu: https://gitlab.com/freepascal.org/fpc/s ... sues/35827 und scheinbar ist das vor einem halben Jahr von MvC in den Compiler gebracht worden. Auch nachdem es länger diskutiert wurde. Ok, wenn man es will kann man es nutzen. Keine Ahnung ob das in den halben Jahr auch in Lazarus gefixt wurde, das der mit dem neuen Feature keine Probleme hat.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Warf
Beiträge: 2284
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Multiline String

Beitrag von Warf »

Das Hauptproblem was ich mit multiline strings hab ist das die indentation zum einen nicht intuitiv klar ist.
In manchen sprachen wird die indentation der ersten Zeile als baseline verwendet und vom string abgezogen. Das macht Formatierung im code schöner aber macht es schwerer text mit whitespace (z.b. markdown) richtig zu formatieren. Andere sprachen haben strikte indentation regeln das jede Zeile des strings bei 0 anfangen muss und jedes whitespace teil des strings ist. In der FPC Umsetzung ist einfach beides drin je nach compiler switch was die Verwirrung nur noch größer macht.

Außerdem bringt es significant whitespace in die Sprache denn:

Code: Alles auswählen

s:='''foo''';
//
S:='''
   foo
   '''
Sind beide vollkommen valides pascal, machen aber gänzlich unterschiedliche sachen.

Ich finds für globale konstanten ist das in Ordnung, da die eh nicht eingerückt sind und meist in einer eigenen Datei liegen. Innerhalb von code, am besten noch 4 Blöcke tief, finde ich multilinear strings gruselig anzusehen

Mathias
Beiträge: 7226
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Multiline String

Beitrag von Mathias »

Ich finds für globale konstanten ist das in Ordnung, da die eh nicht eingerückt sind und meist in einer eigenen Datei liegen. Innerhalb von code, am besten noch 4 Blöcke tief, finde ich multilinear strings gruselig anzusehen
Genau so ist es, für kleine Shader ist es ideal. Oder für keine String-Listen.

Sowas wäre schon einiges schöner als das Geflickte mit dem LineEnding.

Code: Alles auswählen

Const
  s=
    'Zeile1'
    'Zeile2'
    'Zeile3';
Aber ich bin zu Frieden so wie es ist. Wen JEDI und SynEdit noch mit macht, ist es schon fast perfekt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Zvoni
Beiträge: 565
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Multiline String

Beitrag von Zvoni »

Mathias hat geschrieben: Mi 25. Feb 2026, 08:43
Ich finds für globale konstanten ist das in Ordnung, da die eh nicht eingerückt sind und meist in einer eigenen Datei liegen. Innerhalb von code, am besten noch 4 Blöcke tief, finde ich multilinear strings gruselig anzusehen
Genau so ist es, für kleine Shader ist es ideal. Oder für keine String-Listen.

Sowas wäre schon einiges schöner als das Geflickte mit dem LineEnding.

Code: Alles auswählen

Const
  s=
    'Zeile1'
    'Zeile2'
    'Zeile3';
Aber ich bin zu Frieden so wie es ist. Wen JEDI und SynEdit noch mit macht, ist es schon fast perfekt.
Finde ich nach wie vor pfui bähh
Sogar dein "Wunsch"

Code: Alles auswählen

Writeln(s);
gibt dann was aus?
"Zeile1Zeile2Zeile3" ?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

PascalDragon
Beiträge: 1029
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Multiline String

Beitrag von PascalDragon »

af0815 hat geschrieben: Di 24. Feb 2026, 13:43 Gibt es einen Compiler Schalter wo man das abdrehen kann ?
{$ModeSwitch MultiLineStrings-}
Zvoni hat geschrieben: Di 24. Feb 2026, 13:38 Wer ist denn auf diese glorreiche Idee gekommen, das sowas nützlich sein könnte?!?!?!
Der Wunsch kam von verschiedener Seite, da es die Verwendung von nicht-Pascal-Code in Pascal vereinfacht und es verglichen mit + LineEnding + definitv besser aussieht. Ich selbst war mehr ein Fan von einer IncludeString-Direktive und ich plane auch nach wie vor noch diese zu integrieren.
Zvoni hat geschrieben: Di 24. Feb 2026, 13:38 Alleine schon, dass man umdenken muss, "Backticks" zu verwenden (so lese ich zumindest dein Beispiel), oder die Single-Quotes zu escapen...
Das Problem war ein Zeichen zu finden, dass im ASCII-Bereich ist, da die anderweitige Verwendung des Single-Quotes ursprünglich nicht angedacht war. Dann kam allerdings das aktuelle Delphi, das die Verwendung mit den drei Single-Quotes hatte. MvC hatte zu dem Zeitpunkt die Backtick Variante bereits in pas2js integriert und wollte das nicht mehr rauslösen. Wenn ich selbst den Merge Request integriert hätte, hätte ich nur die Single-Quote Variante wegen Delphi integriert und die Backtick Variante rausgelassen. Allerdings hatte ich keine Zeit dazu, deswegen hat es MvC integriert und damit haben wir jetzt beide... 🤷‍♀️
FPC Compiler Entwickler

Benutzeravatar
Zvoni
Beiträge: 565
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Multiline String

Beitrag von Zvoni »

PascalDragon hat geschrieben: Do 26. Feb 2026, 21:35
af0815 hat geschrieben: Di 24. Feb 2026, 13:43 Gibt es einen Compiler Schalter wo man das abdrehen kann ?
{$ModeSwitch MultiLineStrings-}
Zvoni hat geschrieben: Di 24. Feb 2026, 13:38 Wer ist denn auf diese glorreiche Idee gekommen, das sowas nützlich sein könnte?!?!?!
Der Wunsch kam von verschiedener Seite, da es die Verwendung von nicht-Pascal-Code in Pascal vereinfacht und es verglichen mit + LineEnding + definitv besser aussieht. Ich selbst war mehr ein Fan von einer IncludeString-Direktive und ich plane auch nach wie vor noch diese zu integrieren.
Zvoni hat geschrieben: Di 24. Feb 2026, 13:38 Alleine schon, dass man umdenken muss, "Backticks" zu verwenden (so lese ich zumindest dein Beispiel), oder die Single-Quotes zu escapen...
Das Problem war ein Zeichen zu finden, dass im ASCII-Bereich ist, da die anderweitige Verwendung des Single-Quotes ursprünglich nicht angedacht war. Dann kam allerdings das aktuelle Delphi, das die Verwendung mit den drei Single-Quotes hatte. MvC hatte zu dem Zeitpunkt die Backtick Variante bereits in pas2js integriert und wollte das nicht mehr rauslösen. Wenn ich selbst den Merge Request integriert hätte, hätte ich nur die Single-Quote Variante wegen Delphi integriert und die Backtick Variante rausgelassen. Allerdings hatte ich keine Zeit dazu, deswegen hat es MvC integriert und damit haben wir jetzt beide... 🤷‍♀️
Vielen Dank für die Erläuterungen.

Und jetzt werf ich noch Würze in die Suppe:
User hat hart codierte Strings im Quell-Code, welche SQL-Statements für MySQL sind.
User will es richtig machen, und escaped die Tabellennamen in MySQL gem. MySQL-Spezifikation....... mit....was wohl?.... Richtig: Backticks

Hoffe der Quellcode-Parser stolpert nicht über "eingebettete" Backticks....
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten