diff --git a/lib/csys/environ.ex b/lib/csys/environ.ex index 9b4c4c0..e36fd84 100644 --- a/lib/csys/environ.ex +++ b/lib/csys/environ.ex @@ -4,7 +4,7 @@ defmodule Scopes.CSys.Environ do alias Scopes.Shape defmodule State do - defstruct [neurons: [], names: %{}, init_seq: []] + defstruct [neurons: [], cells: %{}, init_seq: []] end def setup({state, proc}, seq \\ []) do @@ -25,14 +25,21 @@ defmodule Scopes.CSys.Environ do def process_creation(msg, {state, proc, syns, env}) do data = Shape.data(msg) new = data.new + addr = data[:addr] + cells = if addr do + [dom, cat, item] = addr + Map.update(state.cells, {dom, cat}, %{item => new}, + fn x -> Map.put(x, item, new) end) + else + state.cells + end neurons = [new | state.neurons] - names = data[:name] && Map.put(state.names, data.name, new) || state.names {step, seq} = List.pop_at(state.init_seq, 0) - state1 = %State{neurons: neurons, names: names, init_seq: seq} + state1 = %State{neurons: neurons, cells: cells, init_seq: seq} CSys.update({state1, proc, syns, env}) if step do Process.sleep(1) - step.(neurons) + step.(env, state1) end end end diff --git a/lib/csys/program.ex b/lib/csys/program.ex index 5afae88..7212933 100644 --- a/lib/csys/program.ex +++ b/lib/csys/program.ex @@ -1,6 +1,8 @@ defmodule Scopes.CSys.Program do require Logger -alias Scopes.CSys + + alias Scopes.CSys + alias Scopes.CSys.Environ alias Scopes.Shape defmodule State do @@ -133,12 +135,17 @@ alias Scopes.CSys # demo init sequences def init_seq_b1() do [ - fn [zero | _ns] -> CSys.send_message(zero, ~w(csys create pred)a, - %{op: [CSys.data_only(), negate()]}) end, - fn [one | _ns] -> CSys.send_message(one, ~w(csys create succ)a, - %{op: CSys.data_only()}) end, - fn [two | _ns] -> CSys.send_message(two, ~w(csys create pred)a) end, - fn [three | others] -> + fn _env, %Environ.State{neurons: [zero]} -> + CSys.send_message(zero, ~w(csys create pred)a, + %{op: [CSys.data_only(), negate()]}) + end, + fn _env, %Environ.State{neurons: [one | _ns]} -> + CSys.send_message(one, ~w(csys create succ)a, %{op: CSys.data_only()}) + end, + fn _env, %Environ.State{neurons: [two | _ns]} -> + CSys.send_message(two, ~w(csys create pred)a) + end, + fn _env, %Environ.State{neurons: [three | others]} -> zero = List.last(others) CSys.send_message(three, ~w(csys connect)a, %{target: zero}) end @@ -146,7 +153,7 @@ alias Scopes.CSys end def init_recursive_1() do [ - fn [zero] -> + fn _env, %Environ.State{neurons: [zero]} -> CSys.send_message(zero, ~w(csys connect)a, %{target: zero, op: negate()}) CSys.send_message(zero, ~w(csys create succ)a, %{name: ~w(csys e01 001)a}) end