Hacker News new | ask | show | jobs
by alco 4363 days ago
I don't understand what you are asking here. The example at the beginning of the "Distribution" section shows how to get the value from the door in room1 while running on the node corresponding to room2.

The same way you can call 'Portal.Door.get({:orange, :"room2@COMPUTER-NAME"})' on the first node (the one corresponding to room1).

1 comments

Hm, I believe that is what I was asking :) I'll have to look when I'm back at my computer with the example code (and and more importantly an elixir install).
Ok, now I see a little more of how things are connected. In my opinion, it would've been nice to be a) more explicit about the naming/aliasing of blue/orange in the final section, and b) Show how to actually read data sent from room2 in room1, eg:

    # Start session for room1, shoot orange portal in room1
    $ iex --sname room1 --cookie secrit -S mix
    iex(room1@COMPUTER-NAME)1> Portal.shoot(:blue)
    {:ok, #PID<0.67.0>}

    # Start session for room2, shoot orange portal in room2
    $ iex --sname room2 --cookie secret -S mix
    iex(room2@COMPUTER-NAME)1> Portal.shoot(:orange)

    # set up aliases/variables for blue/orange in room2
    iex(room2@COMPUTER-NAME)1> blue = {:blue, :"room1@COMPUTER-NAME"}
    {:blue, :room1@COMPUTER-NAME}
    {:ok, #PID<0.68.0>}
    iex(room2@COMPUTER-NAME)3> orange = {:orange, :"room2@COMPUTER-NAME"}
    {:orange, :room2@COMPUTER-NAME}

    # Use aliases to set up portal transfer in room2
    iex(room2@COMPUTER-NAME)4> portal = Portal.transfer(orange, blue, [1,2,3,4])
    #Portal<
      {:orange, :room2@COMPUTER-NAME} <=> {:blue, :room1@COMPUTER-NAME}
                    [1, 2, 3, 4] <=> []

    iex(room2@COMPUTER-NAME)5> Portal.push_right(portal)
    #Portal<
      {:orange, :room2@COMPUTER-NAME} <=> {:blue, :room1@COMPUTER-NAME}
                       [1, 2, 3] <=> [4]

    # set up aliases/variables for blue/orange in room1 (saves typing!)
    iex(room1@COMPUTER-NAME)2> orange = {:orange, :"room2@COMPUTER-NAME"}
    {:orange, :room2@COMPUTER-NAME}
    iex(room1@COMPUTER-NAME)3> blue = {:blue, :"room1@COMPUTER-NAME"}
    {:blue, :room1@COMPUTER-NAME}

    # Anything in the door?
    iex(room1@COMPUTER-NAME)4> Portal.Door.get(orange)
    [4, 3, 2, 1]
    iex(room1@COMPUTER-NAME)5> Portal.Door.get(blue)
    []

    #Switch to room2, push a value:
    iex(room1@COMPUTER-NAME)6> Portal.Door.get(blue)
    [4]
    iex(room1@COMPUTER-NAME)7> Portal.Door.get(orange)
    [3, 2, 1]

    # Verify that we're communicating, in room1:
    iex(room1@kuromaki)6> Portal.Door.get(blue)
    [4]
    iex(room1@kuromaki)7> Portal.Door.get(orange)
    [3, 2, 1]
   
I'm still not entirely clear on if it's possible to access the "portal" from both rooms [edit: to call push_right from room1 on the portal instantiated in the session in room2] -- could I get at it from room1 by qualifying it with room2@COMPUTER-NAME? If so what would the implications be? I assume functions are called via message passing, so this would be safe?

I think a lot of the stuff up to the very last bit is good, I just feel the article stops a little short. Maybe I just need to read it again (and play more with elixir).