Declaration syntax
deed
none at none.none
Tue Jan 7 16:23:33 PST 2014
From time to time I find the declaration syntax slightly awkward.
The main
reason is that the identifiers come after the types, making it
harder to
identify names and get an overview of the code. This bothered me
enough to
start playing with alternatives.
My two questions are:
1. Are there technical reasons not to do it this way, like
grammar/ambiguity,
parsing time, etc.?
2. Have others been thinking in same direction playing with
converters
or alternative front ends?
NB! This is by no means any suggestion to change D-syntax.
Modifications:
1. Swap type and name. Like Go, but return type between function
name and
parameter list.
2. Names come first, all other annotations after. ALWAYS. Example:
private const(int)[] foo(const(int)[] all, int newNum, int
sum) {}
becomes
foo const(int)[](all const(int)[], newNum int, sum int)
private {}
At this point the readability and overview would be improved
IMO.
3. Separate parameter names from their types.
foo(all, newNum, sum) const(int)[](const(int)[], int, int)
private {}
A couple of examples from phobos follow below:
//========================================
// From std.container
//========================================
// Current syntax
struct Range
{
private Node * _first;
private Node * _last;
private this(Node* first, Node* last);
private this(Node* n);
@property bool empty() const nothrow;
@property T front();
void popFront();
@property Range save();
@property T back();
void popBack();
}
// Modified syntax
Range struct
{
_first Node* private;
_last Node* private;
this(first, last) (Node*, Node*) private;
this(n) (Node*) private;
empty bool() @property const nothrow;
front T() @property;
popFront void();
save Range() @property ;
back T() @property;
popBack void();
}
//========================================
// From std.datetime
//========================================
// Current syntax
abstract class TimeZone
{
public:
@property string name() const nothrow;
@property string stdName() const nothrow;
@property string dstName() const nothrow;
@property abstract bool hasDST() const nothrow;
abstract bool dstInEffect(long stdTime) const nothrow;
abstract long utcToTZ(long stdTime) const nothrow;
abstract long tzToUTC(long adjTime) const nothrow;
Duration utcOffsetAt(long stdTime) const nothrow;
static immutable(TimeZone) getTimeZone(string name);
static string[] getInstalledTZNames(string subName = "");
private:
this(string name, string stdName, string dstName) immutable
pure;
immutable string _name;
immutable string _stdName;
immutable string _dstName;
}
// Modified syntax
TimeZone class abstract
{
public:
name() string() @property const nothrow;
stdName() string() @property const nothrow;
dstName() string() @property const nothrow;
hasDST() bool() @property const nothrow abstract;
dstInEffect(stdTime) bool(long) abstract const nothrow;
utcToTZ(stdTime) long(long) abstract const nothrow;
tzToUTC(adjTime) long(long) abstract const nothrow;
utcOffsetAt(stdTime) Duration(long) const nothrow;
getTimeZone(name) static immutable TimeZone(string);
getInstalledTZNames(subName = "") static string[] (string);
private:
this(name, stdName, dstName) (string, string, string)
immutable pure;
_name immutable string;
_stdName immutable string;
_dstName immutable string;
}
// Alternative layout:
TimeZone class abstract
{
public:
name() string() @property const nothrow;
stdName() string() @property const nothrow;
dstName() string() @property const nothrow;
hasDST() bool() @property const nothrow
abstract;
dstInEffect( stdTime ) bool(long) abstract const nothrow;
utcToTZ( stdTime ) long(long) abstract const nothrow;
tzToUTC( adjTime ) long(long) abstract const nothrow;
utcOffsetAt( stdTime ) Duration(long) const nothrow;
getTimeZone( name ) static immutable TimeZone(string);
getInstalledTZNames( subName = "")
static string[](string);
private:
this(name, stdName, dstName) (string, string, string)
immutable pure;
_name immutable string;
_stdName immutable string;
_dstName immutable string;
}
//========================================
// From std.getopt
//========================================
// Current syntax
private void getoptImpl(T...)(ref string[] args, ref
configuration cfg, T opts);
void handleOption(R)(string option, R receiver, ref string[] args,
ref configuration cfg, bool incremental);
private bool optMatch(string arg, string optPattern, ref string
value,
configuration cfg);
// Modified syntax
getoptImpl(args, cfg, opts) private
(T...) void (ref string[], ref configuration, T);
handleOption(option, receiver, args, cfg, incremental)
(R) void (string, R, ref string[], ref configuration, bool);
optMatch(arg, optPattern, value, cfg) private
bool (string, string, ref string, configuration);
More information about the Digitalmars-d
mailing list