diff --git a/lib/core/environ.ex b/lib/core/environ.ex index 1ecc6e9..73320ea 100644 --- a/lib/core/environ.ex +++ b/lib/core/environ.ex @@ -42,6 +42,7 @@ defmodule Scopes.Core.Environ do addr = data[:addr] cells = if addr do [dom, cat, item] = addr + # update (or create and register) proxy cell Map.update(state.cells, {dom, cat}, %{item => new}, fn x -> Map.put(x, item, new) end) else diff --git a/lib/core/program.ex b/lib/core/program.ex index c9115fd..24486d6 100644 --- a/lib/core/program.ex +++ b/lib/core/program.ex @@ -62,6 +62,7 @@ defmodule Scopes.Core.Program do [:csys, :connect | _rest] -> Core.connect(msg, scope) [:csys, :create, :succ | _rest] -> create_succ(msg, scope) [:csys, :create, :pred | _rest] -> create_pred(msg, scope) + [:csys, :create | _rest] -> create(msg, scope) #[:csys, :next | _rest] -> next(msg, scope) _ -> Core.forward(msg, scope) || Core.notify(msg, scope) end @@ -103,6 +104,16 @@ defmodule Scopes.Core.Program do Core.send_message(new, ~w(csys connect)a, Map.put(data, :target, self())) end + def create(msg, scope) do + new = Core.create(msg, restart(scope)) + data = Shape.data(msg) + case data[:dir] do + :succ -> Core.send_message(self(), ~w(csys connect)a, Map.put(data, :target, new)) + :pred -> Core.send_message(new, ~w(csys connect)a, Map.put(data, :target, self())) + _ -> nil + end + end + # synapse operations def multiply(n) do @@ -128,34 +139,23 @@ defmodule Scopes.Core.Program do one = [:csys, :s01, "1-0"] two = [:csys, :c00, "1-1"] three = [:csys, :s01, "1-1"] - [ - fn state -> - Environ.send_message(state, zero, ~w(csys create pred)a, - %{op: [Core.data_only(), negate()], addr: one}) - end, - fn state -> - Environ.send_message(state, one, ~w(csys create succ)a, - %{op: Core.data_only(), addr: two}) - end, - fn state -> - Environ.send_message(state, two, ~w(csys create pred)a, %{addr: three}) - end, - fn state -> Environ.connect(state, three, zero) end + [ + &Environ.send_message(&1, zero, ~w(csys create pred)a, + %{op: [Core.data_only(), negate()], addr: one}), + &Environ.send_message(&1, one, ~w(csys create succ)a, + %{op: Core.data_only(), addr: two}), + &Environ.send_message(&1, two, ~w(csys create pred)a, %{addr: three}), + &Environ.connect(&1, three, zero) ] end def init_recursive_1() do zero = [:csys, :c00, "0-0"] [ - fn state -> - Environ.connect(state, zero, zero, negate()) - Environ.send_message(state, zero, ~w(csys create succ)a, - %{addr: [:csys, :e01, "1-1"]}) - end, - fn state -> - Environ.send_message(state, zero, ~w(csys create pred)a, - %{addr: [:csys, :s01, "1-1"]}) - end + &Environ.send_message(&1, zero, ~w(csys create succ)a, %{}), + &Environ.send_message(&1, zero, ~w(csys create pred)a, + %{addr: [:csys, :s01, "1-1"]}), + &Environ.connect(&1, zero, zero, negate()) ] end end