cl-scopes/csys/program.lisp

68 lines
2.4 KiB
Common Lisp

;;;; cl-scopes/csys/program - common and general csys program definitions
(defpackage :scopes/csys/program
(:use :common-lisp)
(:local-nicknames (:actor :scopes/core/actor)
(:csys :scopes/csys)
(:environ :scopes/csys/environ)
(:util :scopes/util))
(:export #:basic-0 #:basic-1))
(in-package :scopes/csys/program)
;;;; basic-0: minimal recursive system
(defun basic-0 ()
(csys:make-program
(list '(:c00 :initial) (csys:std-proc :actions (b0-actions-zero-initial))
'(:e01 :initial) (csys:eff-proc :actions (csys:basic-actions))
':default (csys:std-proc :actions (csys:basic-actions)))))
(defun b0-actions-zero-initial ()
(util:plist-merge (csys:basic-actions)
(list :next (b0-next-zero-initial))))
(defun b0-next-zero-initial ()
(lambda (msg scope)
(let ((self actor:*self*))
(csys:send-create self :cat :e01 :connect :succ)
(csys:send-create self :cat :s01 :loc "0-1" :connect :pred)
(csys:send-connect self self :op (csys:multiply -1))
;; switch :active
nil)))
;;;; basic-1: minimal cross-linked system
(defun basic-1 ()
(csys:make-program
(list '(:s00 :initial) (csys:std-proc :actions (b1-zero-actions-initial))
'(:s00 :basic) (csys:std-proc :actions (b1-one-actions-basic))
'(:e00 :default) (csys:eff-proc :actions (csys:basic-actions))
':default (csys:std-proc :actions (csys:basic-actions)))))
(defun b1-zero-actions-initial ()
(util:plist-merge (csys:basic-actions)
(list :next (b1-next-zero-initial))))
(defun b1-next-zero-initial ()
(lambda (msg scope)
(let ((self actor:*self*))
(csys:send-create self :cat :e00 :loc "1-0" :connect :succ)
(csys:send-create self :cat :e00 :loc "1-1" :connect :succ :op (csys:multiply -1))
(csys:send-create self :cat :s00 :stage :basic :loc "0-1")
;; switch :active
nil)))
(defun b1-one-actions-basic ()
(util:plist-merge (csys:basic-actions)
(list :next (b1-next-one-basic))))
(defun b1-next-one-basic ()
(lambda (msg scope)
(let ((self actor:*self*)
(env (csys:environ scope)))
(environ:send-connect env :to self :target '(:csys :e00 "1-0")
:op (csys:multiply -1))
(environ:send-connect env :to self :target '(:csys :e00 "1-1"))
;; switch :active
nil)))