diff --git a/presence/conversation.rkt b/presence/conversation.rkt index 9c52dca..0d21eea 100644 --- a/presence/conversation.rkt +++ b/presence/conversation.rkt @@ -29,6 +29,8 @@ ;; Reexported from unify.rkt for convenience wild + wild? + non-wild? ) (struct arrived (who) #:prefab) ;; someone arrived diff --git a/presence/unify.rkt b/presence/unify.rkt index 348e5ec..fd6124b 100644 --- a/presence/unify.rkt +++ b/presence/unify.rkt @@ -7,6 +7,8 @@ (provide (struct-out variable) (struct-out canonical-variable) wild + wild? + non-wild? variables-in unify unify/env @@ -45,6 +47,16 @@ (define (wild [base-name '_]) (variable (gensym base-name))) +;; Any -> Boolean +;; True iff the argument is a variable or canonical-variable. +(define (wild? x) + (or (variable? x) (canonical-variable? x))) + +;; Any -> Boolean +;; True iff the argument is neither a variable nor a canonical-variable. +(define (non-wild? x) + (not (wild? x))) + ;; Any -> Set (define (variables-in x) (let walk ((x x) (acc (set))) @@ -134,7 +146,7 @@ (define env (make-hash)) ;; cheeky use of mutation (let walk ((t t)) (cond - [(or (upper-case-symbol? t) (variable? t) (canonical-variable? t)) + [(or (upper-case-symbol? t) (wild? t)) (cond [(hash-ref env t #f)] [else (define v (canonical-variable (hash-count env))) (hash-set! env t v) v])] [(pair? t) (cons (walk (car t)) (walk (cdr t)))] @@ -178,7 +190,7 @@ (define env (make-hash)) ;; cheeky use of mutation (let walk ((t t)) (cond - [(or (variable? t) (canonical-variable? t)) + [(wild? t) (cond [(hash-ref env t #f)] [else (define v ((if (canonical-variable? t) canon-handler var-handler) t env)) (hash-set! env t v) @@ -246,8 +258,8 @@ (define (specialization? a b) (let walk ((a a) (b b)) (cond - [(or (variable? b) (canonical-variable? b)) #t] - [(or (variable? a) (canonical-variable? a)) #f] + [(wild? b) #t] + [(wild? a) #f] [(and (pair? a) (pair? b)) (and (walk (car a) (car b)) (walk (cdr a) (cdr b)))] [(and (vector? a) (vector? b) (= (vector-length a) (vector-length b)))