[erlang-questions] client in erlang server in objective C

Joe Armstrong <>
Wed Jul 18 14:16:42 CEST 2012


On Wed, Jul 18, 2012 at 12:07 PM, Dmitry Klionsky <> wrote:
> Decided to help you a little further:

Thanks - I appreciate this ...
I have a few more questions (inline)

>
> The problem is you can't just send("button", ...), because the "button" is
> not a symbol, but a NSButton's class (or something like this) instance.
> I'm not sure because I've never done any MacOX programming, but iOS.
> And in order to send a message to an instance you need to know it. So, in
> general, your workflow should be like this:
>
> Erlang side:
> %% create button
> send
> {create_instance, {string, "NSButton"}}
> receive
> {ok, Instance}

question 1:
Is Instance an integer here? (see question 3)

>
> %% set button's title
> send
> {perform, {integer, Button} {string, "setTitle:"}, {string, "click me"}}

Button is the integer in "Instance" above I assume

> receive
> ok
>
>
> Objective-C side
>
> On receiving {create_instance, {string, Clazz}}:
>
> // note that `Class' is a reserved word
> id instance = [[NSClassFromString(Clazz) alloc] init];
> if (instance) {

    What is instance? is this "really"  a 32 bit pointer?
     How do I serialize it to send it back to erlang?


>    reply {ok, instance};
> } else {
>    reply {error, @"No such class"}
> }
>
> On receiving {perform, {integer, Instance}, {string, Selector}, {string,
> Object}}:
> SEL sel = NSSelectorFromString(Selector);
> if (sel) {
>    if ([Instance respondsToSelector(sel)]) {
>          [Instance performSelector:sel withObject:Object];
>       reply ok;
>    } else {
>         reply {error, @"No such selector"};
>    }
> } else {
>   reply {error, @"Invalid selector"}
> }

Same question here. On the "wire" I'll see an encoding of
{perform, {integer, Instance}, ... and so on How do I make an Objective
C id or NSString from a sequence of bytes that I read from a socket.
Also do I have to worry about strings (for example) being garbage collected.

For example If I say (in objective C)

     NSString s = @"hello"

I create a literal string in the variable s

But if I receive a string "hello" somewhere in a buffer from a socket
I need to create a NSString and put it somewhere so it doesn't get
garbage collected away. Something like:

   NSMutableArray *stringtable = [[NSMutableArray alloc] init];

    NSString s = [[NSString alloc] initWithString: Data]
    [stringtable addObject:s];

(Pardon my Objective C here - I'm a total beginner here)

> This was a little messy, but hopefully you will get the idea.

Yes - I get the idea, the problem is the nitty gritty details, not the idea.
The idea is easy. Allocate some memory to store the stuff you received in
create some dynamic objects and call some methods - problem is how.

Thanks - I'll try this later

/Joe

>
>
>
> On 07/18/2012 11:42 AM, Dmitry Klionsky wrote:
>>
>> Hi Joe,
>>
>> NSSelectorFromString, NSClassFromString and others are your friends here.
>>
>> For more detail have a look at:
>>
>> Objective-C Runtime Programming Guide
>>
>> https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html
>>
>> Objective-C Programming Language
>>
>> https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html
>>
>> Also I would also suggest you to evaluate the protobuffs. In my opinion
>> the protobuffs are more concise and clear.
>> There a couple of Objective-C implementations available:
>> http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers
>> https://github.com/booyah/protobuf-objc
>>
>>
>> Best regards,
>> Dmitry Klionsky
>>
>>
>> On 07/18/2012 11:10 AM, Joe Armstrong wrote:
>>>
>>> That's a very interesting idea. I haven't used thrift - but if the server
>>> side code exists in Objective C this would be very interesting.
>>>
>>> (I tried to build thrift but the build failed :-)
>>>
>>>
>>> I've now actually got an erlang client talking to an objective C
>>> server - using AsnycSocket that Bob suggested but I can only exchange
>>> strings.
>>>
>>> Now I need to figure out how to do build dynamic method calls in
>>> objective C.
>>>
>>> In objective C I'd write
>>>
>>>       [button setTitle:@"click me"]
>>>
>>> In Erlang I'd like to encode this as a string
>>> send it to objective C decode it and evaluate it.
>>>
>>> I'd like to do something like
>>>
>>>      send("button", "setTitle", [{string,"click me"}])
>>>
>>> In erlang
>>>
>>>     or to encode   [foo this:123 that:@"yea"] as
>>>
>>>     send("foo", "this:that", [{integer,123},{string,"yea"}])
>>>
>>> Then I'd like to serialize this as a string (in Erlang) and decode it
>>> and evaluate it in Objective C
>>>
>>>      Any ideas how to do this?
>>>
>>> /Joe
>>>
>>>
>>> On Tue, Jul 17, 2012 at 11:48 PM, Anthony Molinaro
>>> <>  wrote:
>>>>
>>>> What about thrift http://thrift.apache.org/
>>>>
>>>> It's RPC style so you describe function calls, erlang clients are easy,
>>>> the objective-c server would be generated for you (other than the
>>>> body of the function).
>>>>
>>>> I've been using thrift to talk java->erlang and erlang->java, so
>>>> talking erlang->objective-c should be straightforward.
>>>>
>>>> Some examples http://wiki.apache.org/thrift/ThriftUsageObjectiveC
>>>>
>>>> -Anthony
>>>>
>>>> On Sat, Jul 14, 2012 at 06:27:49PM +0200, Joe Armstrong wrote:
>>>>>
>>>>> I want the following:
>>>>>
>>>>>     - Client in erlang (easy)
>>>>>    - Server in objective C (I'm thinking Mac OS-X lion - xcode 4.2 -
>>>>> cocoa)
>>>>>    -  socket communication
>>>>>
>>>>> [[ I'm a complete beginner with xcode/objective C ]]
>>>>>
>>>>> Has anybody written a simple objective C client that opens a port
>>>>> waits for a message then executes a callback. This should be
>>>>> non-blocking
>>>>> and be integrated with the "standard" dispatcher top-loop.
>>>>>
>>>>> I'm confused by the profusion of classes that almost do this.
>>>>>
>>>>> Has anybody implemented this, or have pointers to a good place to
>>>>> start.
>>>>>
>>>>> Cheers
>>>>>
>>>>> /Joe
>>>>> _______________________________________________
>>>>> erlang-questions mailing list
>>>>> 
>>>>> http://erlang.org/mailman/listinfo/erlang-questions
>>>>
>>>> --
>>>> ------------------------------------------------------------------------
>>>> Anthony Molinaro<>
>>>
>>> _______________________________________________
>>> erlang-questions mailing list
>>> 
>>> http://erlang.org/mailman/listinfo/erlang-questions
>>
>>
>>
>
>
> --
> Best regards,
> Dmitry Klionsky
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions



More information about the erlang-questions mailing list