smalltalk-tng
diff experiments/unipat.scm @ 321:c4a0718c2d3c
Sketch of dependencies
| author | Tony Garnock-Jones <tonygarnockjones@gmail.com> |
|---|---|
| date | Sat Oct 08 15:36:03 2011 -0400 (7 months ago) |
| parents | |
| children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/experiments/unipat.scm Sat Oct 08 15:36:03 2011 -0400 1.3 @@ -0,0 +1,108 @@ 1.4 +;; Unifying pattern-matching, parsing, and method dispatch 1.5 + 1.6 +(define (alt p1 p2) 1.7 + (lambda (msg kt kf) 1.8 + (p1 msg 1.9 + kt 1.10 + (lambda () (p2 msg kt kf))))) 1.11 + 1.12 +;; { .foo (x, 2, y) -> .ok } 1.13 +;; 1.14 +;; seq(literal("foo"), seq(tuple(3, [bind(x, discard()), literal(2), bind(y, discard())]), 1.15 +;; cut( ... ))) 1.16 + 1.17 +(define (p . xs) 1.18 + (write xs) 1.19 + (newline) 1.20 + (last xs)) 1.21 + 1.22 +(define (seq p1 p2) 1.23 + (lambda (msg kt kf) 1.24 + (p 'seq msg) 1.25 + (if (null? msg) 1.26 + (kt (seq p1 p2) msg) 1.27 + (p1 (car msg) 1.28 + (lambda (sv remainder) (p2 (cdr msg) kt kf)) 1.29 + kf)))) 1.30 + 1.31 +(define (empty-seq) 1.32 + (literal '())) 1.33 + 1.34 +(define (tuple n pats) 1.35 + (let ((tp (fold-right seq (empty-seq) pats))) 1.36 + (lambda (msg kt kf) 1.37 + (p `(tuple ,n) msg) 1.38 + (if (and (vector? msg) 1.39 + (= (vector-length msg) n)) 1.40 + (tp (vector->list msg) kt kf) 1.41 + (kf))))) 1.42 + 1.43 +(define (discard) 1.44 + (lambda (msg kt kf) 1.45 + (p 'discard msg) 1.46 + (kt msg '()))) 1.47 + 1.48 +(define (literal v) 1.49 + (lambda (msg kt kf) 1.50 + (p `(literal ,v) msg) 1.51 + (if (eqv? msg v) 1.52 + (kt msg '()) 1.53 + (kf)))) 1.54 + 1.55 +(define (cut obj-producer-thunk) 1.56 + (lambda (msg kt kf) 1.57 + (p 'cut msg) 1.58 + (kt (obj-producer-thunk) msg))) 1.59 + 1.60 +(define (fail) 1.61 + (lambda (msg kt kf) 1.62 + (p 'fail msg) 1.63 + (kf))) 1.64 + 1.65 + 1.66 +(define (feed parser msg) 1.67 + (parser msg 1.68 + (lambda (sv remainder) 1.69 + (p 'SUCCESS sv remainder) 1.70 + (if (null? remainder) 1.71 + 'complete 1.72 + (feed sv remainder))) 1.73 + (lambda () 1.74 + (p 'FAILURE) 1.75 + 'incomplete))) 1.76 + 1.77 + 1.78 +;; { .x -> { .y -> 1 } ; 1.79 +;; .x -> { .z -> 2 } ; 1.80 +;; .z -> { _ -> 3 } } 1.81 + 1.82 +(define (t) 1.83 + (alt (seq (literal 'x) (cut (lambda () (seq (literal 'y) (cut (lambda () 1)))))) 1.84 + (alt (seq (literal 'x) (cut (lambda () (seq (literal 'z) (cut (lambda () 2)))))) 1.85 + (alt (seq (literal 'z) (cut (lambda () (seq (discard) (cut (lambda () 3)))))) 1.86 + (fail))))) 1.87 + 1.88 +;; { .x .y -> 1 ; 1.89 +;; .x .z -> 2 ; 1.90 +;; .z _ -> 3 } 1.91 + 1.92 +(define (t2) 1.93 + (alt (seq (literal 'x) (seq (literal 'y) (cut (lambda () 1)))) 1.94 + (alt (seq (literal 'x) (seq (literal 'z) (cut (lambda () 2)))) 1.95 + (alt (seq (literal 'z) (seq (discard) (cut (lambda () 3)))) 1.96 + (fail))))) 1.97 + 1.98 +(define (drive name parser msg) 1.99 + (p '------------DRIVE name msg) 1.100 + (p '--> (feed parser msg)) 1.101 + (newline)) 1.102 + 1.103 +(define (drive4 name parser) 1.104 + (drive name parser '(x y)) 1.105 + (drive name parser '(x z)) 1.106 + (drive name parser '(x x)) 1.107 + (drive name parser '(z z))) 1.108 + 1.109 +(define (run) 1.110 + (drive4 't (t)) 1.111 + (drive4 't2 (t2)))
