[erlang-questions] programming tip: a note on encapsulation

Joe Armstrong <>
Thu Nov 19 08:59:38 CET 2009


I hadn't thought of it that way. This reminds me of Javascript.

I define an object constructor

make_my_thing(Data) ->
    fun(data) -> Data;
       (f1)   -> fun(X)    -> do_something(X, Data)         end;
       (f2)   -> fun(X, Y) -> do_something_else(X, Y, Data) end
    end.

Then I can say

   F = make_my_thing(...)
   F(f1)(a, b)
   F(data) ...

I could make mutable objects with:

make_another_object(Data) ->
         Pid = spawn(fun() -> .... end),
         F = fun({call,X}) -> rpc(pid, X);
                   (...) -> end.


On Wed, Nov 18, 2009 at 11:08 PM, Richard O'Keefe <> wrote:
>
> On Nov 18, 2009, at 9:56 PM, Joe Armstrong wrote:
>
>> Here's a little programming technique I discovered yesterday, which I
>> rather like.
>
> It looks a whole lot like the way people used to do "objects" in T.
>   (define (make-my-object ....)
>     (lambda (Selector)
>       (case Selector
>         (field ....)
>         (method (lambda (....) ....))
>         ....))))
> with the equivalent of
>    foo = new MyObject(...);
>    foo.method(x, y)
>    foo.field
> being
>    (let ((Foo (make-my-object ....)))
>      ((Foo 'method) X Y)
>      (Foo 'field)
>
> It looks as though "Joe hates OO" may have to be rewritten!
>
>
>
>


More information about the erlang-questions mailing list