[fpc-pascal] Record operator for assignment

Sven Barth pascaldragon at googlemail.com
Fri Apr 28 07:43:01 CEST 2017


Am 28.04.2017 06:06 schrieb "Ryan Joseph" <ryan at thealchemistguild.com>:
>
> Instead of making constructors and doing busy work It would be nice if
Free Pascal could let you assign records outside of type blocks like:
>
> rec := (x: 0; y: 0; z: 0);
>
> Why isn’t this possible btw? I saw some C++ code do this and it seems
like an obvious solution that should have existed 20 years ago. The feature
exists for type blocks so why not just enable it for other parts of code?

It would introduce an ambiguity as "(x" could also complete to other
expressions (e.g. "(x + y) * 2" or even merely "(x)"). Especially older
Pascal compilers were geared towards the simplicity of the language and
thus they didn't add it. For FPC it simply never came up.

> I had another idea to make this a little simpler by using open arrays and
operator overloading. The compiler doesn’t permit this however. Is it a
bug, my code or just a limitation?
>
> ============
>
>
> type
>         TMyRec = record
>                 x, y, z: integer;
>                 class operator Explicit(v: array of integer): TMyRec;
>         end;
>
> class operator TMyRec.Explicit(v: array of integer): TMyRec;
> begin
>         result.x := v[0];
>         result.y := v[1];
>         result.z := v[2];
> end;
>
>
> var
>         rec: TMyRec;
>
> rec := TMyRec([1, 2, 3]); // Illegal type conversion: "Set Of Byte" to
"TMyRec"

The compiler currently prefers to cast array constructors towards sets,
especially if they contain values that could be expressed as a set. That
will change once proper support for array constructors is added. Though I
don't know whether this would work then ;)

Regards,
Sven
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20170428/02a55eb3/attachment.html>


More information about the fpc-pascal mailing list