small improvements

This commit is contained in:
Sam Caldwell 2019-03-22 15:34:38 -04:00
parent 170e2b28ce
commit a8d398eec7
1 changed files with 40 additions and 31 deletions

View File

@ -187,7 +187,21 @@
(Observe (Struct 'BookQuoteT (list String )))) (Observe (Struct 'BookQuoteT (list String ))))
(check-true (hash-has-key? transitions (Know quote-request))) (check-true (hash-has-key? transitions (Know quote-request)))
(check-equal? (hash-ref transitions (Know quote-request)) (check-equal? (hash-ref transitions (Know quote-request))
(set (set 'seller 'fulfill))))) (set (set 'seller 'fulfill))))
(test-case
"compile role that quits"
(define r
(Role 'x
(list (Reacts (Know Int)
(Stop 'x '())))))
(define state# (compile r))
(check-true (hash-has-key? state# (set)))
(check-true (hash-has-key? state# (set 'x)))
(define state0 (hash-ref state# (set 'x)))
(define transitions (state-transitions state0))
(check-true (hash-has-key? transitions (Know Int)))
(check-equal? (hash-ref transitions (Know Int))
(set (set)))))
;; Role -> FacetTree ;; Role -> FacetTree
(define (make-facet-tree role) (define (make-facet-tree role)
@ -348,36 +362,31 @@
;; Role -> (Hashof FacetName TransitionDesc) ;; Role -> (Hashof FacetName TransitionDesc)
;; Extract a description of all roles mentioned in a Role ;; Extract a description of all roles mentioned in a Role
(define (describe-roles role) (define (describe-roles role)
(let loop ([roles (list role)] (define all-roles (enumerate-roles role))
[desc (hash)]) (for/hash ([r (in-list all-roles)])
(match roles (define txn (describe-role r))
[(cons role roles) (values (Role-nm r)
(match-define (Role nm eps) role) txn)))
(define txn (describe-role role))
(define next-desc (hash-set desc nm txn)) ;; T -> (Listof Role)
(define acts ;; Find all nested role descriptions
(define (enumerate-roles t)
(match t
[(Role _ eps)
(define rs
(for*/list ([ep (in-list eps)] (for*/list ([ep (in-list eps)]
#:when (Reacts? ep) #:when (Reacts? ep)
[body (in-value (Reacts-body ep))] [body (in-value (Reacts-body ep))]
[act (in-list (Body->actions body))]) [act (in-list (Body->actions body))]
act)) [role (in-list (enumerate-roles act))])
;; need to find references to Roles inside arbitrarily nested Stops role))
(let search ([acts acts] (cons t rs)]
[more-roles roles])
(match acts
['()
(loop more-roles next-desc)]
[(cons act acts)
(match act
[(Role _ _)
(search acts (cons act more-roles))]
[(Stop _ body) [(Stop _ body)
(define more-acts (Body->actions body)) (for*/list ([act (in-list (Body->actions body))]
(search (append acts more-acts) more-roles)] [role (in-list (enumerate-roles act))])
[_ role)]
(search acts more-roles)])]))] [(Spawn _)
['() (error)]))
desc])))
;; Role -> TransitionDesc ;; Role -> TransitionDesc
;; determine how the event handlers in a role alter the facet tree ;; determine how the event handlers in a role alter the facet tree