I think that open arrays are one of the contenders for the worst constructs introduced to pascal. They look like dynamic arrays, behave in 80% of the time like dynamic arrays, and the only way most people find out that they are something different is by trying to use them as a dynamic array and it failing in the other 20%. It's not just not intuitive, this is counter intuitive design.
But open arrays actually have a bit of a justification for their existance. They allow to define a fixed but arbitrary number of parameters at compiletime. A dynamic array will be created at runtime, when you create a dynamic array of int with "[1, 2, 3]", it will allocate memory for 3 ints on the heap and fill that array. An open array on the other hand can be prepared more flexible. An open array is afaik nothing other than just 2 pointers, one pointing to the first element, one pointing to the last element. So for example the compiler can push the parameters on the stackframe for the called function and pass those parameters. If the parameters are constants, the compiler can create this as a hidden variable and pass those parameters to it.
It also works out of the box with both static and dynamic arrays, while if it were just a dynamic array, any static array would first need to be copied to a new memory location for the dynamic array.
As an example on how this looks compiled, check out this simple example:
https://godbolt.org/z/6hGPP58ncfunction Sum(arr: array of Integer): Integer;
var
i: Integer;
begin
Result := 0;
for i:=Low(arr) to High(arr) do
Result += arr[i];
end;
procedure ReadAndSum;
var
a, b, c, s: Integer;
begin
ReadLn(a);
ReadLn(b);
ReadLn(c);
s := Sum([a, b, c]);
WriteLn(s);
end;
What happens to call sum is the following:
movl %r12d,8(%rsp)
movl %r13d,12(%rsp)
movl %r14d,16(%rsp)
leaq 8(%rsp),%rdi
movl $2,%esi
call sum(array_of_longint)
As you can see, the 3 variables are pushed onto the stack, before calling the sum function. This way the whole construction of an dynamic array can be avoided.
Also not to mention they allow in the cdecl calling convention to be used as varadic function arguments to be compatible with C (e.g. for using or being used by other libraries or code)
So while I would fully agree that open arrays are not well designed, because of the fact that they are really unintuitive, the idea behind them is not that bad and they are actually useful