Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Sven Barth via fpc-pascal
Ryan Joseph  schrieb am Do., 14. Juni 2018,
14:48:

>
>
> > On Jun 14, 2018, at 7:26 PM, Sven Barth via fpc-pascal <
> fpc-pascal@lists.freepascal.org> wrote:
> >
> > Because one needs to be able to represent the properties in the RTTI.
> Without pointers all that is needed to access the property from code is an
> offset. With pointers you'd need to add where dereferences are required
> especially as the "path" to the final field could be more complex (e.g.
> Field1^.Field3.Field1.Field5^.FinalField).
>
> I guess I don’t understand because I thought an offset to a pointer you
> dereference is as good as an offset to anything else. The property contains
> the ^ symbol so it should know to dereference the pointer at the offset
> right?
>

The RTTI for a property contains *only* the offset to the final field
inside the record, object or class instance. With a dereference in between
this does not work anymore as the field could now be anywhere.

Regards,
Sven
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Ryan Joseph


> On Jun 14, 2018, at 7:51 PM, Ryan Joseph  wrote:
> 
> Jonathan Blow disagrees with you then. :) None of this matter for typical 
> desktop applications. This is strictly for real time graphics, games etc… 
> where getting tons of cache misses on every frame is an actual problem. 

Btw here’s the link to his language test. The first 10 minutes he goes well 
into the problem and he plans to solve it. I would think Pascal programmers 
would find this extremely interesting. I did at least. :)

https://www.youtube.com/watch?v=ZHqFrNyLlpA

Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Ryan Joseph


> On Jun 14, 2018, at 7:42 PM, Marcos Douglas B. Santos  
> wrote:
> 
> It is the opposite: programming languages should help programmers
> to make code which is better read by human being, not CPU.

Jonathan Blow disagrees with you then. :) None of this matter for typical 
desktop applications. This is strictly for real time graphics, games etc… where 
getting tons of cache misses on every frame is an actual problem. 

That aside I think the language can keep the code in basically the same state 
but let us rearrange thins in a more efficient manner at the same time.

Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Ryan Joseph


> On Jun 14, 2018, at 7:26 PM, Sven Barth via fpc-pascal 
>  wrote:
> 
> Because one needs to be able to represent the properties in the RTTI. Without 
> pointers all that is needed to access the property from code is an offset. 
> With pointers you'd need to add where dereferences are required especially as 
> the "path" to the final field could be more complex (e.g. 
> Field1^.Field3.Field1.Field5^.FinalField).

I guess I don’t understand because I thought an offset to a pointer you 
dereference is as good as an offset to anything else. The property contains the 
^ symbol so it should know to dereference the pointer at the offset right?

It would be so much nicer to do this with properties then making tons of boiler 
plate code that fills up the implementation and requires maintaining if you 
change names etc… If you could somehow do it inside the record (like c++) then 
it would be easier to maintain but in Pascal and separate implementation 
section it becomes a bit of a chore.

Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Ryan Joseph


> On Jun 14, 2018, at 7:19 PM, Martin  wrote:
> 
> You can do that without the "with"
> record TFoo
>   Bar: TOtherRecord; // has a field abc
> end;
> 
> The only thing is that you need to access the field by its fully qualified 
> name Foo.Bar.abc, instead of Foo.abc.
> Which is good, because you can have
> 
> record TFoo
>   Bar: TOtherRecord; // has a field abc
>   Other: TOtherRecord; // has a field abc
> end;
> 
> and as with multiple inheritance "Foo.abc" would be ambiguous.

yeah so you wouldn’t design your data like that. :) There’s always a potential 
for naming conflicts but some how we manage them.

> 
> And as already was mentioned you can have properties to shortcut this.
> But then the question came up why not:
> 
> record TFoo
>   Bar: POtherRecord; // pointer
>   property abc: xxx read Bar^.abc
> end;
> 
> Well because abc may be nil. But then it is no longer "continuous memory"

That’s not what you’d do though. Like my response above this assumes you 
actually know what you’re doing and you aren’t going to trash memory.


Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Marcos Douglas B. Santos
On Thu, Jun 14, 2018 at 8:43 AM, Ryan Joseph  wrote:
>
[...]
> His premise for the proposal is that programming languages
> should help the programmer to make code which is better read
> by the CPU instead of high-level constructs for abstract concepts.
> It’s very specific to a particular task but very important for
> low-languages like c++ and Pascal which are close to the CPU.

It is the opposite: programming languages should help programmers
to make code which is better read by human being, not CPU.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Sven Barth via fpc-pascal
Ryan Joseph  schrieb am Do., 14. Juni 2018,
11:59:

>
>
> > On Jun 14, 2018, at 4:44 PM, Ryan Joseph 
> wrote:
> >
> > Something I tried was using properties like this but it didn’t work. Is
> that something properties could do? It feels like they should be able to
> reach into records fields that since everything is known to the property as
> time of declaration.
> >
> > property Position: TVec2D read entity^.position;
>
> I just did a test and found out property does indeed access record fields
> (that’s great to know) but when I made it a pointer that’s when it broke.
> Why not make properties do this?
>
> type
> TEntity = record
> position: TVec2;
> end;
> TEntityPtr = ^TEntity;
>
> type
> TDoor = record
> entity: TEntityPtr;
> state: boolean;
> property position: TVec2 read entity^.position;
> end;
>

Because one needs to be able to represent the properties in the RTTI.
Without pointers all that is needed to access the property from code is an
offset. With pointers you'd need to add where dereferences are required
especially as the "path" to the final field could be more complex (e.g.
Field1^.Field3.Field1.Field5^.FinalField).
For this the solution is a getter function that you can also declare as
"inline".

Regards,
Sven

>
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Martin

On 14/06/2018 13:43, Ryan Joseph wrote:



On Jun 14, 2018, at 5:18 PM, Mattias Gaertner  wrote:

If you only want that, why not use objects?

The real reason Jon Blow proposed this syntax is because it allows you keep 
continuous arrays of memory which you can index into using struts.
The fact it mimics multiple inheritance (something Pascal doesn’t have anyways) 
is just a bonus.



You can do that without the "with"
record TFoo
  Bar: TOtherRecord; // has a field abc
end;

The only thing is that you need to access the field by its fully 
qualified name Foo.Bar.abc, instead of Foo.abc.

Which is good, because you can have

record TFoo
  Bar: TOtherRecord; // has a field abc
  Other: TOtherRecord; // has a field abc
end;

and as with multiple inheritance "Foo.abc" would be ambiguous.

And as already was mentioned you can have properties to shortcut this.
But then the question came up why not:

record TFoo
  Bar: POtherRecord; // pointer
  property abc: xxx read Bar^.abc
end;

Well because abc may be nil. But then it is no longer "continuous memory"
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Ryan Joseph


> On Jun 14, 2018, at 5:18 PM, Mattias Gaertner  
> wrote:
> 
> If you only want that, why not use objects?

The real reason Jon Blow proposed this syntax is because it allows you keep 
continuous arrays of memory which you can index into using struts. The fact it 
mimics multiple inheritance (something Pascal doesn’t have anyways) is just a 
bonus.

His premise for the proposal is that programming languages should help the 
programmer to make code which is better read by the CPU instead of high-level 
constructs for abstract concepts. It’s very specific to a particular task but 
very important for low-languages like c++ and Pascal which are close to the CPU.

Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Mattias Gaertner
On Thu, 14 Jun 2018 16:44:40 +0700
Ryan Joseph  wrote:

>[...]
> The idea of “with” inside records is so interesting because it basically 
> mimics inheritance without going full class.

If you only want that, why not use objects?

Mattias
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Ryan Joseph


> On Jun 14, 2018, at 4:25 PM, Sven Barth via fpc-pascal 
>  wrote:
> 
> omething like that only leads to confusion. Pascal is a rather explicit 
> language so manually declaring a Position property inside TDoor would be more 
> in the spirit of the language. 
> 
> A possible alternative would be generic type helpers, like this (just an 
> example, not working code):

That’s probably the best available solution but more verbose than “with” in 
records. JB also hinted at how templates could be used to hack up something and 
I think this is what had in mind. :) The idea of “with” inside records is so 
interesting because it basically mimics inheritance without going full class. 
Now that I’ve seen it it feels like a natural extension of how data should be 
able to be laid out.

Something I tried was using properties like this but it didn’t work. Is that 
something properties could do? It feels like they should be able to reach into 
records fields that since everything is known to the property as time of 
declaration.

property Position: TVec2D read entity^.position;

> 
> === code beging ===
> 
> type
>   generic TEntityUserHelper = type helper for T
>   private
> function GetPosition: TVec2D; inline;
> procedure SetPosition(constref aValue: TVec2D); inline;
>   public
> property Position: TVec2D read GetPosition write SetPosition;
>   end;
> 
> function TEntityUserHelper.GetPosition: TVec2D;
> begin
>   Result := Self.Entity^.Position;
> end;
> 
> procedure TEntityUserHelper.SetPosition(constref aValue: TVec2D);
> begin
>   Self.Entity^.Position := aValue;
> end;
> 
> type
>   TDoor = record
> Entity: PEntity;
> State: Boolean;
>   end;
>   TDoorHelper = specialize TEntityUserHelper;
> 
> var
>   door: TDoor;
> begin
>   // init door
>   door.Position := Vec2D(21, 42);
> end;
> 
> === code end ===
> 
> 
> 
> // works with function parameters also.
> // this is almost like a class helper or at very least mimics “self” in 
> methods.
> 
> procedure OpenDoor(with var door: TDoor);
> begin
> state := true; // with imports door namespace into entire function 
> scope
> end;
> 
> The declaration of the function (in the interface section) would need to 
> contain the "with" as all parameters have to match (and its only that parts 
> are removed from the definition (default parameters, modifiers), but not the 
> other way around) and thus the declaration would "spill" information about 
> the function while not needing to. 
> And again I think that as an expressive language the explicit usage of a 
> "with" block is better than something like this. Please also not that there 
> are people out there that advocate *against* the usage of "with" at all as it 
> is likely to introduce bugs with it. 

I don’t follow the syntax issue in the first paragraph or understand why it’s a 
problem to have with in both the interface and implementation (var is that way 
after all).

A with block does the same thing but putting in the parameters basically mimics 
what classes do with methods, i.e. a hidden “self” which is the first parameter 
and hidden in the scope. It’s such a common pattern for procedural API’s where 
the first param is a pointer to the member data that it makes sense to be part 
of the language imo.

The reason Jonathan Blow suggested this is to get out of OOP designs when 
really all you want is the syntactic sugar of not typing door^.xxx all the 
time, which is reason enough to make a class in some people minds. He’s using 
c++ though so he has no fallback like “with" in Pascal and even so wrapping 
entire functions in with .. do is not as nice as his idea.

Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Ryan Joseph


> On Jun 14, 2018, at 4:44 PM, Ryan Joseph  wrote:
> 
> Something I tried was using properties like this but it didn’t work. Is that 
> something properties could do? It feels like they should be able to reach 
> into records fields that since everything is known to the property as time of 
> declaration.
> 
> property Position: TVec2D read entity^.position;

I just did a test and found out property does indeed access record fields 
(that’s great to know) but when I made it a pointer that’s when it broke. Why 
not make properties do this?

type
TEntity = record
position: TVec2;
end;
TEntityPtr = ^TEntity;

type
TDoor = record
entity: TEntityPtr;
state: boolean;
property position: TVec2 read entity^.position;
end;


Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Sven Barth via fpc-pascal
Ryan Joseph  schrieb am Do., 14. Juni 2018,
10:03:

> type
> TEntity = record
> position: TVec2;
> end;
> TEntityPtr = ^TEntity;
>
> type
> TDoor = record
> with entity: TEntityPtr; // import entity namespace for
> entire TDoor scope
> state: boolean;
> end;
>
> var
> door: TDoor;
> begin
> door.entity := GetAvailableEntity;  // pop an entity from
> storage
> door.position := V2(1, 1);  // entity is “with” so we
> get access to its members (door.entity^.position)
>

Something like that only leads to confusion. Pascal is a rather explicit
language so manually declaring a Position property inside TDoor would be
more in the spirit of the language.

A possible alternative would be generic type helpers, like this (just an
example, not working code):

=== code beging ===

type
  generic TEntityUserHelper = type helper for T
  private
function GetPosition: TVec2D; inline;
procedure SetPosition(constref aValue: TVec2D); inline;
  public
property Position: TVec2D read GetPosition write SetPosition;
  end;

function TEntityUserHelper.GetPosition: TVec2D;
begin
  Result := Self.Entity^.Position;
end;

procedure TEntityUserHelper.SetPosition(constref aValue: TVec2D);
begin
  Self.Entity^.Position := aValue;
end;

type
  TDoor = record
Entity: PEntity;
State: Boolean;
  end;
  TDoorHelper = specialize TEntityUserHelper;

var
  door: TDoor;
begin
  // init door
  door.Position := Vec2D(21, 42);
end;

=== code end ===



> // works with function parameters also.
> // this is almost like a class helper or at very least mimics “self” in
> methods.
>
> procedure OpenDoor(with var door: TDoor);
> begin
> state := true; // with imports door namespace into entire function
> scope
> end;
>

The declaration of the function (in the interface section) would need to
contain the "with" as all parameters have to match (and its only that parts
are removed from the definition (default parameters, modifiers), but not
the other way around) and thus the declaration would "spill" information
about the function while not needing to.
And again I think that as an expressive language the explicit usage of a
"with" block is better than something like this. Please also not that there
are people out there that advocate *against* the usage of "with" at all as
it is likely to introduce bugs with it.

Regards,
Sven

>
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Ryan Joseph


> On Jun 14, 2018, at 3:23 PM, Marco van de Voort  wrote:
> 
>> // works with function parameters also.
>> // this is almost like a class helper or at very least mimics ?self? in 
>> methods.
>> 
>> procedure OpenDoor(with var door: TDoor);
>> begin
>>  state := true; // with imports door namespace into entire function scope
>> end;
> 
> you set a runtime variable to add a compiletime scope ? I don't understand.
> 
> Is your reference language an interpreter?


the “with” in the parameter is like a “with door do” block inside the entire 
function scope. I really liked this idea of his because it’s basically 
something Pascal already does but it’s automatic with this syntax.

procedure OpenDoor(var door: TDoor);
begin
  with door do
   begin
 state := true; // with imports door namespace into entire function scope
   end;
end;


Regards,
Ryan Joseph

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] Better usage of "with"

2018-06-14 Thread Marco van de Voort
In our previous episode, Ryan Joseph said:
> // works with function parameters also.
> // this is almost like a class helper or at very least mimics ?self? in 
> methods.
> 
> procedure OpenDoor(with var door: TDoor);
> begin
>   state := true; // with imports door namespace into entire function scope
> end;

you set a runtime variable to add a compiletime scope ? I don't understand.

Is your reference language an interpreter?
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal