csys:value-add as first real action handler (with parameters)

This commit is contained in:
Helmut Merz 2026-07-25 07:51:13 +02:00
parent 42195f0cef
commit c31421cee9
2 changed files with 43 additions and 18 deletions

View file

@ -12,8 +12,8 @@
#:make-program #:make-program
#:neuron #:std-proc #:eff-proc #:create-zero #:neuron #:std-proc #:eff-proc #:create-zero
#:handle-action #:handle-action
#:no-op #:notify
#:notify)) #:no-op #:value-add))
(in-package :scopes/csys) (in-package :scopes/csys)
@ -74,23 +74,25 @@
(defun process (scope) (defun process (scope)
(lambda (msg) (funcall (proc scope) msg scope))) (lambda (msg) (funcall (proc scope) msg scope)))
(defun std-proc (msg scope &key (default (remember)) actions params) (defun std-proc (&key (default (remember)) actions)
(lambda (msg scope)
(util:mv-bind (nmsg (nscope scope)) (util:mv-bind (nmsg (nscope scope))
(handle-action msg scope :default default :actions actions :params params) (handle-action msg scope :default default :actions actions)
(when nmsg (forward nmsg (syns nscope))) (when nmsg (forward nmsg (syns nscope)))
(update nscope))) (update nscope))))
(defun eff-proc (msg scope &key params actions) (defun eff-proc (&key actions)
(lambda (msg scope)
(util:mv-bind (nmsg (nscope scope)) (util:mv-bind (nmsg (nscope scope))
(handle-action msg scope :default (no-op) :actions actions :params params) (handle-action msg scope :default (no-op) :actions actions)
(setf (nth 1 (shape:head nmsg)) :effect) (setf (nth 1 (shape:head nmsg)) :effect)
(when nmsg (notify nmsg nscope)) (when nmsg (notify nmsg nscope))
(update nscope))) (update nscope))))
(defun handle-action (msg scope &key (default (no-op)) actions params) (defun handle-action (msg scope &key (default (no-op)) actions)
(let* ((key (message:action msg)) (let* ((key (message:action msg))
(act (getf actions key (getf actions :default default)))) (act (getf actions key (getf actions :default default))))
(apply act msg scope params))) (funcall act msg scope)))
(defun forward (msg syns) (defun forward (msg syns)
(dolist (s syns) (dolist (s syns)
@ -116,7 +118,26 @@
(setf (value scope) (shape:data-value msg :value)) (setf (value scope) (shape:data-value msg :value))
(values msg scope))) (values msg scope)))
(defun value-add (&key (bias 0) (threshold 0))
(lambda (msg scope)
(let* ((val (getf (shape:data msg) :value))
(newval (+ val (value scope))))
(if (>= newval threshold)
(let* ((head (new-msg-head msg scope))
(msg (message:create head :data (list :value newval))))
(setf (value scope) bias)
(values msg scope))
(progn
(setf (value scope) newval)
(values nil scope))))))
(defun create () (defun create ()
(lambda (msg scope) (lambda (msg scope)
(let ((new (neuron (apply #'reset-scope scope (shape:data msg))))) (let ((new (neuron (apply #'reset-scope scope (shape:data msg)))))
(notify-created msg new scope)))) (notify-created msg new scope)
nil)))
;;;; helpers
(defun new-msg-head (msg scope)
(list (message:domain msg) (message:action msg) (cadr (categ scope))))

View file

@ -41,6 +41,9 @@
(when nmsg (when nmsg
(actor:send (core:mailbox (tc:receiver t:*test-suite*)) nmsg))))) (actor:send (core:mailbox (tc:receiver t:*test-suite*)) nmsg)))))
(defun actions ()
(list :value (csys:value-add)))
(defun run () (defun run ()
(let ((t:*test-suite* (make-instance 'tc:test-suite :name "csys"))) (let ((t:*test-suite* (make-instance 'tc:test-suite :name "csys")))
(load (t:test-path "config-csys" "etc")) (load (t:test-path "config-csys" "etc"))
@ -63,11 +66,12 @@
env)) env))
(deftest test-basic-0 () (deftest test-basic-0 ()
(let ((env (setup-test (csys:make-program #'csys:eff-proc))) (let ((env (setup-test (csys:make-program (csys:eff-proc :actions (actions)))))
;(env (setup-test (csys:make-program (csys:eff-proc))))
;(env (setup-test (test-program)) ;(env (setup-test (test-program))
(rcvr (tc:receiver t:*test-suite*))) (rcvr (tc:receiver t:*test-suite*)))
(sleep 0.1) (sleep 0.1)
(tc:expect rcvr (message:create '(:csys :effect :c00 "0-0") :data '(:value 1))) (tc:expect rcvr (message:create '(:csys :effect :c00) :data '(:value 1)))
(actor:send env (message:create '(:csys :value :c00 "0-0") :data '(:value 1))) (actor:send env (message:create '(:csys :value :c00 "0-0") :data '(:value 1)))
(sleep 0.1) (sleep 0.1)
(core:shutdown))) (core:shutdown)))