proposal for better syntax for extern objective-C and compatibility with named argument parameters

Timothee Cour thelastmammoth at gmail.com
Wed Jun 26 22:35:11 PDT 2013


See [1][2] for related thread introducing extern(objective C)

A)
The syntax proposed in [2] transforms:
-(void) insertItemWithObjectValue: (NSString *) path atGreen:(NSInteger)
anInt;
[obj insertItemWithObjectValue:val atGreen:idx ];

into:
void insertItem(NSString* object, NSInteger anInt)
[insertItemWithObjectValue:atGreen:];
obj.insertItem(val, idx);

B)
I don't see how it handles this case:
[obj insertItemWithObjectValue:val atGreen:idx ];
[obj insertItemWithObjectValue:val atRed:idx ];

obj.insertItem(val, idx); //atGreen or atRed ?

C)
The fact that one needs to come up with a new name insertItem is not good
(as done in [2] ). And if we reuse the name:
'void insertItemWithObjectValue(NSString* object, NSInteger anInt)
[insertItemWithObjectValue: atGreen:];'
Then it's not DRY.

D)
the variable list is separated from the argument name list; this makes it
less readable with more arguments.

E)
the only benefit of objective C's syntax (making it clear at call site what
is the argument description) is lost.

----
F)
*I'd like to propose instead the following syntax:*
void insertItemWithObjectValue(NSString* object, NSInteger atGreen:);
void insertItemWithObjectValue(NSString* object, NSInteger atRed:);
obj. insertItemWithObjectValue(object, atGreen: idx);
obj. insertItemWithObjectValue(object, atRed: idx);

Advantages:
* unambiguous (cf B)
* no need to come up with new name or repeat it (cf C)
* no need to separate variables from their submethod name (cf D)
* more D-like, yet reminiscent of objective C argument description at call
site (without those fugly objective C brackets)

G)
Finally, this would be compatible with *named argument parameter
syntax*that I and others have been pushing for, if they are ever
introduced in D.
There were many proposals but I'd like to propose this:

void fun1(int a, int b, int c:, int d:);
obj.fun1(1, 2, c:3, d:4);

void fun2(int a, int b, int c:3, int d:4);
obj.fun2(1, 2); => fun2(1,2,c:3,d:4)
obj.fun2(1, 2,d:0); => fun2(1,2,c:3,d:0)
obj.fun2(1, 2,d:0, c:6); => fun2(1,2,c:6,d:4)

'd:' indicates that d argument is mandatory at call site and name d is part
of the API.
'd:4' indicates that d argument is optional at call site and name d is part
of the API;
optional named arguments must appear after all other arguments, and can be
reordered / omitted.

----
[1]
for
https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CC8QFjAA&url=http%3A%2F%2Fforum.dlang.org%2Fthread%2Fkq7li9%242j9v%241%40digitalmars.com&ei=OMbLUae3LLD0iwLl04CACw&usg=AFQjCNHScB2VEdtBBSnkFKum21Gz3sIUDw&sig2=1ToqlVmg6nDWMMpxPg5Lcg&bvm=bv.48572450,d.cGE

[2]
http://michelf.ca/projects/d-objc/syntax/#protocols
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20130626/04c6a3a0/attachment-0001.html>


More information about the Digitalmars-d mailing list