Changes from code review

This commit is contained in:
Tony Garnock-Jones 2014-06-14 12:41:17 -04:00
parent 5b7b192b60
commit 1faa122c49
3 changed files with 27 additions and 23 deletions

View File

@ -105,14 +105,17 @@
;; Only adds to its second argument if its first is nonempty.
(define cons-metalevel (guarded-cons empty-metalevel))
;; Gestalt Nat -> Metalevel
(define (gestalt-metalevel-ref g n)
(safe-list-ref (gestalt-metalevels g) n (lambda () empty-metalevel)))
;; Gestalt × Value × Natural × Boolean → (Setof PID)
;; Retrieves those PIDs that have active subscriptions/advertisements
;; covering the given message at the given metalevel.
(define (gestalt-match-value g body metalevel is-feedback?)
(define levels (safe-list-ref (gestalt-metalevels g) metalevel (lambda () empty-metalevel)))
(for/fold [(acc (set))] [(level (in-list levels))]
(define matcher ((if is-feedback? cdr car) level)) ;; feedback targets advertisers/publishers
(set-union (matcher-match-value matcher body) acc)))
(define extract-matcher (if is-feedback? cdr car)) ;; feedback targets advertisers/publishers
(define (pids-at level) (matcher-match-value (extract-matcher level) body))
(apply set-union (map pids-at (gestalt-metalevel-ref g metalevel))))
;; (Listof Projection) -> CompiledProjection
;; For use with gestalt-project.
@ -133,10 +136,10 @@
;; Retrieves the Matcher within g at the given metalevel and level,
;; representing subscriptions or advertisements, projected by capture-spec.
(define (gestalt-project g metalevel level get-advertisements? capture-spec)
(define levels (safe-list-ref (gestalt-metalevels g) metalevel (lambda () empty-metalevel)))
(define matcher ((if get-advertisements? cdr car)
(safe-list-ref levels level (lambda () empty-level))))
(if (equal? capture-spec capture-everything-projection)
(define extract-matcher (if get-advertisements? cdr car))
(define level (safe-list-ref (gestalt-metalevel-ref g metalevel) level (lambda () empty-level)))
(define matcher (extract-matcher level))
(if (equal? capture-spec capture-everything-projection) ;; efficiency hack. Avoid projecting by identity
matcher
(matcher-project matcher capture-spec)))
@ -165,9 +168,8 @@
;; Gestalts.
(define (simple-gestalt is-adv? p level metalevel)
(define m (pattern->matcher #t p))
(gestalt (prepend metalevel empty-metalevel
(list (prepend level empty-level
(list (if is-adv? (cons #f m) (cons m #f))))))))
(define pom (if is-adv? (cons #f m) (cons m #f)))
(gestalt (prepend metalevel empty-metalevel (list (prepend level empty-level (list pom))))))
;; -> Gestalt
;; The empty gestalt.
@ -178,9 +180,8 @@
;; TODO: our invariants should ensure that (gestalt-empty? g) iff (equal? g (gestalt '())).
;; Make sure this actually is true.
(define (gestalt-empty? g)
(andmap (lambda (ml)
(andmap (lambda (l) (and (matcher-empty? (car l)) (matcher-empty? (cdr l)))) ml))
(gestalt-metalevels g)))
(for*/and [(ml (in-list (gestalt-metalevels g))) (l (in-list ml))]
(and (matcher-empty? (car l)) (matcher-empty? (cdr l)))))
;; map-zip: ((U 'right-longer 'left-longer) (Listof X) -> (Listof Y))
;; (X X -> Y)
@ -235,8 +236,11 @@
;; Computes the union of its arguments.
(define (gestalt-union1 g1 g2) (gestalt-combine-straight g1 g2 (lambda (side x) x) matcher-union))
;; TODO: abstract out the folding skeletons of gestalt-filter and gestalt-match.
;; Gestalt Gestalt -> Gestalt
;; View on g1 from g2's perspective.
;; Implements the "(p)_n || <p>_m if n < m" part of NC.
(define gestalt-filter
(let ()
(define (filter-metalevels mls1 mls2)

View File

@ -48,7 +48,7 @@
;; In principle, security restrictions should make it impossible.
;; But absent those, what should be done? Should an offending
;; process be identified and terminated?
(when (not es) (error 'extract-active-events "User program subscribed to wildcard event"))
(unless es (error 'extract-active-events "User program subscribed to wildcard event"))
(for/list [(ev (in-set es))]
(match-define (list e) ev)
(event-handler e)))

View File

@ -8,6 +8,8 @@
;; TODO: rename to matcher.rkt or similar.
;; TODO: Ontology
;; TODO: (generally) interpretations for data definitions
(provide ;; Patterns and Projections
?
wildcard?
@ -82,6 +84,7 @@
(define matcher-match-matcher-unit (make-parameter (cons (set) (set))))
;; The project-success function should return #f to signal "no success values".
(define matcher-project-success (make-parameter values))
;; Constructs a structure type and a singleton instance of it.
@ -665,23 +668,19 @@
(define (projection->pattern p)
(let walk ((p p))
(match p
[(capture sub) (walk sub)] ;; TODO: maybe enforce non-nesting here too?
[(capture sub) sub] ;; TODO: maybe enforce non-nesting here too?
[(cons p1 p2) (cons (walk p1) (walk p2))]
[(? vector? v) (for/vector [(e (in-vector v))] (walk e))]
[(embedded-matcher _) p]
[(? non-object-struct?)
(define-values (t skipped?) (struct-info p))
(when skipped? (error 'projection->pattern "Cannot reflect on struct instance ~v" p))
(define fs (cdr (vector->list (struct->vector p))))
(apply (struct-type-make-constructor t) (map walk fs))]
(apply (struct-type-make-constructor (struct->struct-type p))
(map walk (cdr (vector->list (struct->vector p)))))]
;; TODO: consider options for treating hash tables as compounds
;; rather than (useless) atoms
[(? hash?) (error 'projection->pattern "Cannot match on hash tables at present")]
[other other])))
;; Matcher × CompiledProjection [× (Value -> (Option Value))] → Matcher
;; Matcher × CompiledProjection -> Matcher
;; The result matches a sequence of inputs of length equal to the number of captures.
;; The project-success function should return #f to signal "no success values".
(define matcher-project
;; TODO: skip-nested, capture-nested, and various cases in walk all
;; share a suspicious amount of code. Refactor it away.
@ -714,6 +713,7 @@
[else (rupdate acc key (capture-nested mk k))])))]
[_ (matcher-empty)]))
;; Boolean Matcher CompiledProjection -> Matcher
(define (walk capturing? m spec)
(match spec
['()