From f7b61b39d398fecba5d2d14ca895d75785bf826a Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 19 May 2010 23:27:14 +0200 Subject: [PATCH] tree-il on expanded-vtables * module/language/tree-il.scm: In a somewhat daring move, inherit the "core" tree-il constructs from %expanded-vtables. --- module/language/tree-il.scm | 78 ++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 18 deletions(-) diff --git a/module/language/tree-il.scm b/module/language/tree-il.scm index bec3bec92..5f4c014fb 100644 --- a/module/language/tree-il.scm +++ b/module/language/tree-il.scm @@ -61,28 +61,70 @@ post-order! pre-order!)) +(define-syntax borrow-core-vtables + (lambda (x) + (syntax-case x () + ((_) + (let lp ((n 0) (out '())) + (if (< n (vector-length %expanded-vtables)) + (lp (1+ n) + (let* ((vtable (vector-ref %expanded-vtables n)) + (stem (struct-ref vtable (+ vtable-offset-user 0))) + (fields (struct-ref vtable (+ vtable-offset-user 2))) + (sfields (map + (lambda (f) (datum->syntax x f)) + fields)) + (type (datum->syntax x (symbol-append '< stem '>))) + (ctor (datum->syntax x (symbol-append 'make- stem))) + (pred (datum->syntax x (symbol-append stem '?)))) + (let lp ((n 0) (fields fields) + (out (cons* + #`(define (#,ctor #,@sfields) + (make-struct #,type 0 #,@sfields)) + #`(define (#,pred x) + (and (struct? x) + (eq? (struct-vtable x) #,type))) + #`(define #,type + (vector-ref %expanded-vtables #,n)) + out))) + (if (null? fields) + out + (lp (1+ n) + (cdr fields) + (let ((acc (datum->syntax + x (symbol-append stem '- (car fields))))) + (cons #`(define #,acc + (make-procedure-with-setter + (lambda (x) (struct-ref x #,n)) + (lambda (x v) (struct-set! x #,n v)))) + out))))))) + #`(begin #,@(reverse out)))))))) + +(borrow-core-vtables) + + ;; () + ;; ( exp) + ;; ( name) + ;; ( name gensym) + ;; ( name gensym exp) + ;; ( mod name public?) + ;; ( mod name public? exp) + ;; ( name) + ;; ( name exp) + ;; ( name exp) + ;; ( test consequent alternate) + ;; ( proc args) + ;; ( exps) + ;; ( meta body) + ;; ( req opt rest kw inits gensyms body alternate) + ;; ( names gensyms vals body) + ;; ( names gensyms vals body) + ;; ( fluids vals body) + (define-type ( #:common-slots (src)) - () - ( exp) - ( name) - ( name gensym) - ( name gensym exp) - ( mod name public?) - ( mod name public? exp) - ( name) - ( name exp) - ( name exp) - ( test consequent alternate) - ( proc args) - ( exps) - ( meta body) - ( req opt rest kw inits gensyms body alternate) - ( names gensyms vals body) - ( names gensyms vals body) ( names gensyms vals body) ( exp body) ( winder body unwinder) - ( fluids vals body) ( fluid) ( fluid exp) ( tag body handler)