csys: work in progress: Environ: + initialization sequence for system setup

This commit is contained in:
Helmut Merz 2026-05-20 12:28:14 +02:00
parent 998be76e34
commit 38207ab8d9
3 changed files with 16 additions and 11 deletions

View file

@ -82,11 +82,9 @@ defmodule Scopes.CSys do
# helpers # helpers
def compose(ops) do def compose(ops) do
fn msg -> &(for op <- ops, reduce: &1 do
for op <- ops, reduce: msg do
nil -> nil nil -> nil
val -> op.(val) val -> op.(val)
end end)
end
end end
end end

View file

@ -3,8 +3,12 @@ defmodule Scopes.CSys.Environ do
alias Scopes.CSys alias Scopes.CSys
alias Scopes.Shape alias Scopes.Shape
def setup({state, proc}) do defmodule State do
scope = {[], &proc_env/2, [], self()} defstruct [neurons: [], init_seq: []]
end
def setup({state, proc}, seq \\ []) do
scope = {%State{init_seq: seq}, &proc_env/2, [], self()}
env = CSys.neuron(scope) env = CSys.neuron(scope)
CSys.create(Shape.create([:csys, :zero]), {state, proc, [], env}) CSys.create(Shape.create([:csys, :zero]), {state, proc, [], env})
env env
@ -12,14 +16,17 @@ defmodule Scopes.CSys.Environ do
def proc_env(msg, scope) do def proc_env(msg, scope) do
case Shape.head(msg) do case Shape.head(msg) do
[:csys, :created | _rest] -> register_creation(msg, scope) [:csys, :created | _rest] -> process_creation(msg, scope)
_ -> nil _ -> nil
end end
send(CSys.env(scope), msg) send(CSys.env(scope), msg)
end end
def register_creation(msg, {state, proc, syns, env}) do def process_creation(msg, {state, proc, syns, env}) do
new = Shape.data(msg).new new = Shape.data(msg).new
CSys.update({[new | state], proc, syns, env}) neurons = [new | state.neurons]
{step, seq} = List.pop_at(state.init_seq, 0)
if step, do: step.(neurons)
CSys.update({%{state | neurons: neurons, init_seq: seq}, proc, syns, env})
end end
end end

View file

@ -34,7 +34,7 @@ defmodule Scopes.CSysTest do
CSys.send_message(two, [:csys, :create, :pred]) CSys.send_message(two, [:csys, :create, :pred])
three = receive_data([:csys, :created]).new three = receive_data([:csys, :created]).new
CSys.send_message(three, [:csys, :connect], %{target: zero}) CSys.send_message(three, [:csys, :connect], %{target: zero})
Process.sleep(2) Process.sleep(3)
CSys.send_value(three, 3) CSys.send_value(three, 3)
assert receive_data().value in [2, 3] assert receive_data().value in [2, 3]
assert receive_data().value in [2, 3] assert receive_data().value in [2, 3]