It was by accident that I discovered that ref Complex c = ref arr [i]; is 
allowed in the vala syntax, while it implements a by-reference semantic, in the 
right-hand side of the assignment. 
Things were different on the left-hand side, where just complex numbers can be 
passed by value, due to the fact that ref Complex c, is not allowed as a local 
variable in a method body. But ref Complex c is preferred when a Complex number 
is the only semantically useful technique to pass a reference to a struct to a 
method through a variable. A specific way to compute the complex conjugate will 
work with a ref formal argument, but the syntax (parser) makes objections when 
the variable is a local variable within a method body. The reason for this 
distinction is, for me, difficult to comprehend.

There are clear reasons why one would not allow a ref Complex as a member 
variable in a class, since that would give problems with 
address-serializations, but I see no objections to ref Complex c; as a member 
variable, used to reference a struct. It is of course possible to resort to the 
c-language aspects of vala to get agrees of reference, that are semantically 
equivalent. Such c-language references can however not be passed to ref 
arguments. 

It is often the goal to implement a fully orthogonal set of that does not make 
a distinction to first class variables (formal arguments) and inferior ones 
like local variables. 

It is from a semantic point of view very important to distinguish between a ref 
variable and a copy of a variable, that is allocated on the stack during a 
function call, this is true for all value types.

I can imagine that a method with a struct as return-value, will just return a 
ref to the struct as the output value, that is used by the caller to copy the 
referenced value.

This would imply that a getter that should return a struct could pass its 
result either by reference, like this is the case when an element of a complex 
array is returned, or as a copy of the reference, depending on the use of the 
ref keyword in combination with the receiving variable.

Vale does not support ref local variables in method bodies, but it does support 
ref in combination with formal arguments. This works fine as long as ref arr 
[i] is used as a formal argument. This fails however when syntax support for 
array acces comes into play. I have the impression that a few special cases 
that are covered by the vala compiler for ref arr [i] are omitted when a getter 
is used, but it could as well be that I have to use code attributes like the 
(un)owned keyword.

I have hence two questions:

1. Is there a good reason why ref Complex s; local variables are not allowed 
within method bodies, while this is the preferred method to get a specific 
semantic behavior when methods are to be called?
2. Do I need code attributes, that influence the behavior of the getter that 
references a struct Complex using syntax support?

Thanks in advance for any help.

J.Smit 
_______________________________________________
vala-list mailing list
vala-list@gnome.org
https://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to