[fpc-devel] Some thoughts on multi-line string support, and a possible syntax that I think is perfectly clean and Pascal-ish.

Ben Grasset operator97 at gmail.com
Sat Jul 6 01:33:50 CEST 2019


On Fri, Jul 5, 2019 at 6:41 PM Sven Barth via fpc-devel <
fpc-devel at lists.freepascal.org> wrote:

> The constant itself is parsed depending on the state of $H and only then
> "assigned" to the constant (just tested that myself). So the directives are
> needed to get the correct string type of the constant
>

{$H+} is definitely not needed for an explicit 'var string: ansistring'. It
works even with {$H-}.

After looking at Ryan's more complete example though, the use of {$mode
SomeLanguageMode} *before* pushing {$H+} does seem to make {$H+} not
recognized. I do not believe that this behaviour is related to any code
I've added so far, however, as I don't see how it possibly could be. Seems
like a bug that nobody came across before.

That said, writing the following *does* work:

program test;

{$push}
{$mode objfpc}
{$H+}

const lines = `
  #version 150

  uniform sampler2D textures[8];
  in vec2 vertexTexCoord;
  in vec4 vertexColor;
  in float vertexUVMap;
  out vec4 fragColor;

  void main()
  {
    if (vertexUVMap == 255) {
      fragColor = vertexColor;
    } else {
      fragColor = texture(textures[int(vertexUVMap)], vertexTexCoord.st);
      if (vertexColor.a < fragColor.a) {
        fragColor.a = vertexColor.a;
      }
    }
  }`;
{$pop}

begin
  writeln(lines);
end.

I'm still very unclear about where Ryan said he got "illegal expression"
and such, though. I just now tested another large number of possible ways
you can use multi-line strings, and they all do work.

On Fri, Jul 5, 2019 at 6:41 PM Sven Barth via fpc-devel <
fpc-devel at lists.freepascal.org> wrote:

> Am 05.07.2019 um 22:30 schrieb Ben Grasset:
>
>
>
> On Fri, Jul 5, 2019 at 1:41 PM Ryan Joseph <genericptr at gmail.com> wrote:
>
>> This doesn’t work either.
>>
>> {$push}
>> {$h+}
>> var lines: ansistring = `
>>   #version 150
>>
>>   uniform sampler2D textures[8];
>>   in vec2 vertexTexCoord;
>>   in vec4 vertexColor;
>>   in float vertexUVMap;
>>   out vec4 fragColor;
>>
>>   void main()
>>   {
>>     if (vertexUVMap == 255) {
>>       fragColor = vertexColor;
>>     } else {
>>       fragColor = texture(textures[int(vertexUVMap)], vertexTexCoord.st);
>>       if (vertexColor.a < fragColor.a) {
>>         fragColor.a = vertexColor.a;
>>       }
>>     }
>>   }`;
>> {$pop}
>>
>> Regards,
>>         Ryan Joseph
>>
>
> Doesn't work in what regard? You wouldn't even need {$H+} there, as you're
> explicitly using an ansistring.
>
> The constant itself is parsed depending on the state of $H and only then
> "assigned" to the constant (just tested that myself). So the directives are
> needed to get the correct string type of the constant.
>
> Regards,
> Sven
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20190705/4f5fa32d/attachment-0001.html>


More information about the fpc-devel mailing list