| Thread overview | |||||
|---|---|---|---|---|---|
|
September 12, 2013 cascade operator or nearest equivalent | ||||
|---|---|---|---|---|
| ||||
Is there any way to simulate the cascade operator (..) of Dart in D? This operator makes fluid initialization simple.
I am using Dart for code generation but would like to consider D if I can find a convenient replacement for the following declarative style:
var dateRange = struct('date_range')
..doc = 'Basic pair of start and end dates'
..unitTest = true
..publicSection = true
..members = [
member('start_date')
..type = 'Date',
member('end_date')
..type = 'Date',
];
So struct is a function that returns an instance of Struct.
class Struct extends Decls {
...
/// Documentation for this D struct
String doc;
/// List of members of this class
List<Member> members = [];
bool unitTest = false;
...
}
..doc = ... assigns to the Struct.doc field and returns the original Struct instance so that ..unitTest = true can be applied to the original Struct instance, etc.
What is the best way to achieve simple declarative style for very large initialization objects?
Thanks,
Dan
| ||||
September 12, 2013 Re: cascade operator or nearest equivalent | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Daniel Davidson | Daniel Davidson: > I am using Dart for code generation but would like to consider D if I can find a convenient replacement for the following declarative style: Replacing Dart with D seems quite strange, such two languages have so much different usage niches. > var dateRange = struct('date_range') > ..doc = 'Basic pair of start and end dates' > ..unitTest = true > ..publicSection = true > ..members = [ > member('start_date') > ..type = 'Date', > member('end_date') > ..type = 'Date', > ]; A similar syntax is not allowed in D, but there are two things that help for this: the C-style initialization of structs, that support field names too, and the with(){} statement. Bye, bearophile | |||
October 08, 2013 Re: cascade operator or nearest equivalent | ||||
|---|---|---|---|---|
| ||||
Posted in reply to bearophile | On Thursday, 12 September 2013 at 19:41:49 UTC, bearophile wrote: > Daniel Davidson: > >> I am using Dart for code generation but would like to consider D if I can find a convenient replacement for the following declarative style: > > Replacing Dart with D seems quite strange, such two languages have so much different usage niches. > > >> var dateRange = struct('date_range') >> ..doc = 'Basic pair of start and end dates' >> ..unitTest = true >> ..publicSection = true >> ..members = [ >> member('start_date') >> ..type = 'Date', >> member('end_date') >> ..type = 'Date', >> ]; > > A similar syntax is not allowed in D, but there are two things that help for this: the C-style initialization of structs, that support field names too, and the with(){} statement. > > Bye, > bearophile The problem with with is the name can not hide each other, so it is easy to get into trouble. With C-style initialization I don't think you can use as expression - I think you need an lvalue for each and this hurts nesting. I have a style I'm playing with and if anyone has comments or improvements (i.e. make more succinct/readable) it would be appreciated. Here is a sample and the source for this and comparable Dart are in the links. auto d = make((ref Dossier _) { _.family = [ "father" : make((ref Person _) { _.birthDate = "2001/1/1"; _.deathDate = "2101/1/1"; _.retirementDate = "2100/1/1"; }), "mother" : make((ref Person _) { _.birthDate = "2005/1/1"; _.deathDate = "2125/1/1"; _.retirementDate = "2100/1/1"; }), ]; _.assets = [ "house" : make((ref Asset _) { _.name = "Home on the Hill"; _.unitValue = 120_000; }), "car" : make((ref Asset _) { _.name = "Dodge Dart"; _.unitValue = 500; }) ]; }); http://pastebin.com/iLVL20Bz http://pastebin.com/mLcWDACm Thanks Dan | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply