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

2013-06-27 Thread Michel Fortin

On 2013-06-27 05:35:11 +, Timothee Cour  said:


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 ?


If green and red are the same type then you can't use overloading and 
must come with two different function names. Here that'd be 
insertItemAtGreen and insertItemAtRed.


I agree we lose some expressiveness by shortening the names, but I 
think keeping the same function call syntax as the rest of D is 
worthwhile. If you require a special syntax for those calls then it 
doesn't integrate well with other parts of D: you can't make an alias 
to those functions nor pass them as alias parameters to templates (not 
without a custom syntax for this too), and generic code designed with D 
in mind will probably not work.



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.


It doesn't matter much. The current design only require specifying the 
selector if you are generating bindings, and this should be automated 
anyway.


Overrides inherit the selector, and original methods get a generated 
selector (which you can get and pass around with a simple syntax). So 
unless you're writing bindings you shouldn't have to care about 
selectors at all. This is a perfectly good way to define an Objective-C 
object:


class MyObject : NSObject
{
private NSString _name;

this(NSString name) { _name = name.copy; }

@property int name() const { return _name.retain.autorelease; }
@property void name(int newName) { _name = newName.copy; }

override NSString description() { return name; }
}

The only thing telling you this is an Objective-C object is that it 
derives from NSObject. You're still programming in D, not in a special 
dialect of D meant to interact with Objective-C. That's the spirit.




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.


Well, the alternative is to use a custom syntax that doesn't play well 
with other D features. It's akin to how C++ and Objective-C can both be 
used in the same file. It could be done, but that's an entirely 
different project.


--
Michel Fortin
michel.for...@michelf.ca
http://michelf.ca/



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

2013-06-27 Thread Paulo Pinto

On Thursday, 27 June 2013 at 05:35:28 UTC, Timothee Cour wrote:

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


Have you had a look at how Mono does it for C#?

http://docs.xamarin.com/guides/ios/advanced_topics/binding_objective-c_libraries

--
Paulo


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

2013-06-27 Thread Jacob Carlborg

On 2013-06-27 07:35, Timothee Cour wrote:

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 ?


In my binding generator (DStep) I just use the whole selector name and 
replaces colons with underscores. This doesn't happen that often.



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


I think this looks a bit weird.


obj. insertItemWithObjectValue(object, atGreen: idx);
obj. insertItemWithObjectValue(object, atRed: idx);


Actually, I wouldn't mind this.

--
/Jacob Carlborg