Hi -

I like the proposal (and have suggested this change in the past).
Also, I think it would be worth writing down the field-er-ator version
of record assignment by name and putting that somewhere accesible
to users in case they want to make a custom version implementing
the old behavior.

Cheers,

-michael

On 04/09/2014 01:46 PM, Tom Hildebrandt wrote:
> All:
>
> Please consider and comment on the following proposed language change.
>
> Thanks,
> Tom Hildebrandt
>
>
> STATUS QUO
> ---------------
> Currently, the Chapel compiler automatically generates an implementation of 
> assignment for each record type defined in the input (including internal 
> modules and any standard modules used).  The signature for each of these 
> assignments is
>
>      proc =(ref a:R, b)
>
> where R is the type of the LHS argument.  As you can see, the type of the RHS 
> argument is unconstrained.  This is to support the semantics currently 
> described in the specification, in which assignment between two objects of 
> arbitrary record type is accomplished through a field-by-field copy where the 
> fields are selected by name.  The layouts of the two records must be 
> compatible to the extent that assignment of like-named fields from the type 
> of the right-hand operand to the type of the left-hand operand is a legal 
> assignment.  If not, a compile-time error is issued.
>
> Unfortunately, the above signature allows 'b' to bind to 'nil' and other 
> objects of class type.  Since 'nil' cannot be assigned to a variable of 
> record type, that case must be captured explicitly and flagged as an error.
>
> PROPOSED CHANGE
> -----------------------
> The implementation would be simplified somewhat if the above signature were 
> replaced with one that constrains the right-hand argument to be of the same 
> type as the left-hand argument:
>
>      proc =(ref a:R, b:R)
>
> In that case, the operand on the right-hand side of a record assignment must 
> be coercible to the type of the left-hand operand.  Since 'nil' cannot be 
> coerced to a record type, that case is automatically rejected.  This proposal 
> would also reject the proposed support for assignment from class objects to 
> record object described in Section 16.9.2 in the specification.  That section 
> would be removed.
>
> This change would mean that records were only assignment-compatible if the 
> right-hand operand is coercible to the type of the left-hand operand.  Unless 
> a user-defined cast is supplied, the supported coercions are only from a 
> derived record type to a base record type.  Field-wise (by name) assignment 
> between unrelated record types would be specifically prohibited.  As an 
> example, the proposed change would cause the test case 
> $CHPL_HOME/test/classes/bradc/records/assignRecord3.chpl to fail.
>
> Aside from simplifying the implementation, the proposed change also enables 
> an optimization.  When records are in the same inheritance hierarchy, the 
> implementation can arrange that they are layout-compatible.  In that case, 
> the implementation can replace trivial assignment (assignments having no 
> side-effects) with the equivalent of a memcpy() call.
>
> Since assignment between class objects is already constrained in this way, 
> the proposed implementation brings the definition of record types and class 
> types into closer alignment.  That can help programmers to understand and use 
> both classes and records effectively.  Arguably, permitting assignment 
> between objects of unrelated record types could be confusing.  However, the 
> likelihood of this is small, since resolution of the assignment will fail if 
> the type of the right-hand operand does not have fields with names covering 
> all the fields in the left-hand operand, and all of those assignments must be 
> valid.
>
> A further argument in favor of the change is that it appears this feature is 
> not relied upon, at least within the Chapel development team.  Only the one 
> test case mentioned above fails due to the proposed change.
>
> PROS
> ------
> * Simplifies the conceptual model
> * Simplifies the implementation
> * Enables the "trivial assignment" optimization
> * Has limited negative impact
>
> CONS
> ------
> * Eliminates field-by-field (by name) assignment between objects of unrelated 
> record types
> * Eliminates the proposed class object to record object assignment semantics


------------------------------------------------------------------------------
Put Bad Developers to Shame
Dominate Development with Jenkins Continuous Integration
Continuously Automate Build, Test & Deployment 
Start a new project now. Try Jenkins in the cloud.
http://p.sf.net/sfu/13600_Cloudbees
_______________________________________________
Chapel-developers mailing list
Chapel-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/chapel-developers

Reply via email to