smalltalk-tng
diff etng-r2/compile-to-scheme.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 | 4d06e035b80e |
| children |
line diff
1.1 --- a/etng-r2/compile-to-scheme.scm Fri Jul 24 16:00:30 2009 +0100 1.2 +++ b/etng-r2/compile-to-scheme.scm Sat Oct 08 15:36:03 2011 -0400 1.3 @@ -1,12 +1,10 @@ 1.4 (define previous-inspector (current-inspector)) 1.5 (current-inspector (make-inspector)) 1.6 1.7 -(define-record-type etng-function 1.8 - (make-etng-function ;;sources 1.9 - clauses) 1.10 - etng-function? 1.11 - ;;(sources etng-function-sources) 1.12 - (clauses etng-function-clauses)) 1.13 +(define-record-type etng-alternation 1.14 + (make-etng-alternation clauses) 1.15 + etng-alternation? 1.16 + (clauses etng-alternation-clauses)) 1.17 1.18 (current-inspector previous-inspector) 1.19 1.20 @@ -49,28 +47,77 @@ 1.21 (namespace-variable-value (mangle-etng-id* builtin-namespace-url localname)) 1.22 message)) 1.23 1.24 -(define (etng-lookup receiver via message) 1.25 - (let lookup ((clauses (etng-function-clauses via))) 1.26 - (if (null? clauses) 1.27 - #f 1.28 - (let apply-loop ((matcher (car clauses)) 1.29 - (args message)) 1.30 - (if (null? args) 1.31 - (make-etng-function ;;... some source code ...? 1.32 - (list matcher 1.33 - (lambda (arg kcomplete kmore kfail) 1.34 - ( 1.35 - (let ((arg (car args)) 1.36 - (remaining-args (cdr args))) 1.37 - (matcher arg 1.38 - (lambda (thunk) thunk) 1.39 - (lambda (next-matcher) (apply-loop next-matcher remaining-args)) 1.40 - (lambda () (lookup (cdr clauses))))))) 1.41 +(define (etng-alternation->parser a) 1.42 + (lambda (input ks kf) 1.43 + (let loop ((clauses (etng-alternation-clauses a))) 1.44 + (if (null? clauses) 1.45 + (kf) 1.46 + ((car clauses) input ks (lambda () (loop (cdr clauses)))))))) 1.47 + 1.48 +(define (make-parser-invocation first-message) 1.49 + (let ((fragments-rev (make-parameter (list first-message)))) 1.50 + (define (fragment-following f) 1.51 + (let search ((candidate #f) 1.52 + (fs (fragments-rev))) 1.53 + (cond 1.54 + ((null? fs) (error 'should-not-reach-here 'fragment-following)) 1.55 + ((eq? (car fs) f) candidate) 1.56 + (else (search (car fs) (cdr fs)))))) 1.57 + (define (remaining-input-following f) 1.58 + (let search ((acc '()) 1.59 + (fs (fragments-rev))) 1.60 + (cond 1.61 + ((null? fs) (error 'should-not-reach-here 'fragment-following)) 1.62 + ((eq? (car fs) f) acc) 1.63 + (else (search (append (car fs) acc) (cdr fs)))))) 1.64 + (define (stream-fragment f) 1.65 + (let loop ((position f)) 1.66 + (lambda (op k) 1.67 + (case op 1.68 + ((next) 1.69 + (if (null? position) 1.70 + (let ((next-fragment (fragment-following f))) 1.71 + (if next-fragment 1.72 + ((stream-fragment next-fragment) 'next k) 1.73 + (let ((so-far (fragments-rev))) 1.74 + (lambda (ignored-receiver) 1.75 + (lambda (message) 1.76 + (parameterize ((fragments-rev (cons message so-far))) 1.77 + ((stream-fragment message) 'next k))))))) 1.78 + (k (car position) (loop (cdr position))))) 1.79 + ((rest) 1.80 + (k (append position (remaining-input-following f)))) 1.81 + (else 1.82 + (error 'invalid-op op)))))) 1.83 + (stream-fragment first-message))) 1.84 + 1.85 +(define (etng-lookup via message) 1.86 + (cond 1.87 + ((etng-alternation? via) 1.88 + ((etng-alternation->parser via) 1.89 + (make-parser-invocation message) 1.90 + (lambda (rhs-thunk-waiting-for-self remaining-input) 1.91 + (remaining-input 'rest 1.92 + (lambda (remaining-message) 1.93 + (if (null? remaining-message) 1.94 + rhs-thunk-waiting-for-self 1.95 + (lambda (receiver) 1.96 + (etng-send (rhs-thunk-waiting-for-self receiver) 1.97 + remaining-message)))))) 1.98 + (lambda () #f))) 1.99 + ((procedure? via) 1.100 + (via message)) 1.101 + (else 'invalid-via (list via message)))) 1.102 + 1.103 +(define (etng-directly-invokable? x) 1.104 + (or (procedure? x) ;; a parser-invocation, (lambda (message) ...) 1.105 + (etng-alternation? x) ;; a parser without invocation: see etng-lookup 1.106 + )) 1.107 1.108 (define (etng-send* receiver via message) 1.109 (cond 1.110 - ((etng-function? via) 1.111 - (let ((thunk (or (etng-lookup receiver via message) 1.112 + ((etng-directly-invokable? via) 1.113 + (let ((thunk (or (etng-lookup via message) 1.114 (error 'does-not-understand receiver via message)))) 1.115 (thunk receiver))) 1.116 ((number? via) (etng-send-via-named-proxy receiver 'numberProxy message)) 1.117 @@ -85,8 +132,7 @@ 1.118 (etng-send* receiver receiver message)) 1.119 1.120 (define (etng-merge-functions f1 f2) 1.121 - (make-etng-function ;;(append (etng-function-sources f1) (etng-function-sources f2)) 1.122 - (append (etng-function-clauses f1) (etng-function-clauses f2)))) 1.123 + (make-etng-alternation (append (etng-alternation-clauses f1) (etng-alternation-clauses f2)))) 1.124 1.125 (define (compile-to-scheme ast) 1.126 1.127 @@ -112,10 +158,8 @@ 1.128 (case (car ast) 1.129 ((ref) (mangle-etng-id (cadr ast))) 1.130 ((lit) `',(cadr ast)) 1.131 - ((object) `(make-etng-function ;;',(cddr ast) 1.132 - (list ,@(map (method (cadr ast)) (cddr ast))))) 1.133 - ((function) `(make-etng-function ;;',(cdr ast) 1.134 - (list ,@(map (method #f) (cdr ast))))) 1.135 + ((object) `(make-etng-alternation (list ,@(map (method (cadr ast)) (cddr ast))))) 1.136 + ((function) `(make-etng-alternation (list ,@(map (method #f) (cdr ast))))) 1.137 ((tuple) `(vector ,@(map expr (cdr ast)))) 1.138 ((send) `(etng-send ,(expr (cadr ast)) (list ,@(map expr (cddr ast))))) 1.139 ((assemble) `(let ,(map (lambda (binding) 1.140 @@ -146,15 +190,20 @@ 1.141 1.142 (define (method self-id) 1.143 (lambda (ast) 1.144 - `(lambda (_arg _kcomplete _kmore _kfail) 1.145 - ,(let* ((patterns (cadr ast)) 1.146 - (body (caddr ast)) 1.147 - (remaining-patterns (cdr patterns))) 1.148 - (pattern (car patterns) 1.149 - (if (null? remaining-patterns) 1.150 - `(_kcomplete (lambda (,(if self-id (mangle-etng-id self-id) '_self)) 1.151 - ,(expr body))) 1.152 - `(_kmore ,((method #f) `(method ,remaining-patterns ,body)))) 1.153 - `(_kfail)))))) 1.154 + (let ((body (caddr ast))) 1.155 + `(lambda (_stream _kt _kf) 1.156 + ,(let loop ((patterns (cadr ast))) 1.157 + `(_stream 'next 1.158 + (lambda (_arg _stream) 1.159 + ,(let* ((remaining-patterns (cdr patterns))) 1.160 + (pattern (car patterns) 1.161 + (if (null? remaining-patterns) 1.162 + `(_kt (lambda (,(if self-id 1.163 + (mangle-etng-id self-id) 1.164 + '_self)) 1.165 + ,(expr body)) 1.166 + _stream) 1.167 + (loop remaining-patterns)) 1.168 + `(_kf)))))))))) 1.169 1.170 (toplevel ast))
