Changeset 31641 for lang/scheme

Show
Ignore:
Timestamp:
03/28/09 14:05:37 (4 years ago)
Author:
mokehehe
Message:

lambda内のinternal defineに対応
direct-invoke時にsetされるとおかしかったのを修正

Location:
lang/scheme/3imp
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lang/scheme/3imp/4.7.scm

    r31636 r31641  
    140140           (ext-vars (append proper-vars (car e)))) 
    141141      (let ((free (cdr e))  ; 上のスコープの自由変数をそのまま引き継ぐ 
    142             (sets (find-setses bodies ext-vars)) 
     142            (sets (set-union s (find-setses bodies ext-vars))) 
    143143            (varnum (if (eq? vars proper-vars) 
    144144                        (cons (length vars) (length vars)) 
     
    148148          (if (null? proper-vars) 
    149149              ;; 変数なし(lambda () ...):EXPAND~SHRINK 自体必要ない 
    150               (make-boxes sets proper-vars 
    151                           (compile-lambda-bodies (car e) bodies (cdr e) sets s 
    152                                                  next)) 
     150              (compile-lambda-bodies (car e) bodies (cdr e) sets s 
     151                                     next) 
    153152            (let ((c (list* EXPAND (length args2) 
    154153                           (make-boxes sets proper-vars 
     
    184183                          next))))) 
    185184 
    186 (define (compile-lambda-bodies vars bodies free sets s last) 
     185(define (compile-lambda-bodies vars bodies free sets s next) 
    187186  (let ((ee (cons vars free)) 
    188187        (ss (set-union sets 
     
    190189    (recur loop ((p bodies)) 
    191190           (if (null? p) 
    192                last 
     191               next 
    193192             (compile (car p) ee ss 
    194193                      (loop (cdr p))))))) 
     
    333332                      a) 
    334333                (LREF (n . x) 
    335                              (VM (index f n) x f c s)) 
     334                      (VM (index f n) x f c s)) 
    336335                (FREF (n . x) 
    337                             (VM (index-closure c n) x f c s)) 
     336                      (VM (index-closure c n) x f c s)) 
    338337                (GREF (sym . x) 
    339                               (VM (refer-global sym (lambda () (error "unbound variable:" sym))) x f c s)) 
     338                      (VM (refer-global sym (lambda () (error "unbound variable:" sym))) x f c s)) 
    340339                (UNBOX x 
    341                           (VM (unbox a) x f c s)) 
     340                       (VM (unbox a) x f c s)) 
    342341                (CONST (obj . x) 
    343                           (VM obj x f c s)) 
     342                       (VM obj x f c s)) 
    344343                (CLOSE (argnum n body . x) 
    345344                       (VM (closure argnum body n s) x f c (- s n))) 
     
    350349                      (VM a (if a then else) f c s)) 
    351350                (LSET (n . x) 
    352                               (set-box! (index f n) a) 
    353                               (VM a x f c s)) 
     351                      (set-box! (index f n) a) 
     352                      (VM a x f c s)) 
    354353                (FSET (n . x) 
    355                              (set-box! (index-closure c n) a) 
    356                              (VM a x f c s)) 
     354                      (set-box! (index-closure c n) a) 
     355                      (VM a x f c s)) 
    357356                (GSET (sym . x) 
    358                                (assign-global! sym a) 
    359                                (VM a x f c s)) 
     357                      (assign-global! sym a) 
     358                      (VM a x f c s)) 
    360359                (CONTI (tail? . x) 
    361360                       (VM (continuation s tail?) x f c s)) 
     
    365364                       (VM a x f c (push ret (push f (push c s))))) 
    366365                (ARG x 
    367                           (VM a x f c (push a s))) 
     366                     (VM a x f c (push a s))) 
    368367                (SHIFT (n . x) 
    369368                       (let ((m (index s (- n 1))))  ; 一つ前の呼び出しの引数の数 
     
    372371                       (do-apply argnum a s)) 
    373372                (RET () 
    374                         (do-return a s)) 
     373                     (do-return a s)) 
    375374                (EXPAND (argnum . x) 
    376                                (expand-frame argnum f s) 
    377                                (VM a x (+ f argnum) c s)) 
     375                        (expand-frame argnum f s) 
     376                        (VM a x (+ f argnum) c s)) 
    378377                (SHRINK (n . x) 
    379                                (shrink-frame n f s) 
    380                                (VM a x (- f n) c (- s n))) 
     378                        (shrink-frame n f s) 
     379                        (VM a x (- f n) c (- s n))) 
    381380                (else 
    382381                 (error "unknown opcode" (car x))))) 
     
    826825 
    827826(define-special-form (lambda vars . bodies) 
    828   `(lambda ,vars ,@(map comp-macroexpand-1 bodies))) 
     827  (define (define? x) (and (pair? x) (eq? (car x) 'define))) 
     828  (define (normalize-define exp) 
     829    (let ((name (car exp)) 
     830          (bodies (cdr exp))) 
     831      (if (pair? name) 
     832          (normalize-define `(,(car name) (lambda ,(cdr name) ,@bodies))) 
     833        exp))) 
     834  (receive (internal-defines actual-bodies) 
     835           (partition define? bodies) 
     836    (let ((defines (map (lambda (x) (normalize-define (cdr x))) internal-defines))) 
     837      (if (null? defines) 
     838          `(lambda ,vars ,@(map comp-macroexpand-1 bodies)) 
     839        `(lambda ,vars 
     840           ((lambda ,(map car defines) 
     841              ,@(map (lambda (e) 
     842                       `(set! ,(car e) ,(cadr e))) 
     843                     defines) 
     844              ,@actual-bodies) 
     845            ,@(map (lambda (_) '()) defines))))))) 
    829846 
    830847(define-special-form (if . all) 
     
    898915 
    899916(define-builtin-macro (letrec parms . bodies) 
    900   `((lambda ,(map car parms) 
    901           ,@(map (lambda (parm) 
    902                            (let ((name (car parm)) 
    903                                          (val (cadr parm))) 
    904                            `(set! ,name ,val))) 
    905                          parms) 
    906           ,@bodies) 
    907         ,@(map (lambda (_) '()) 
    908                    parms))) 
     917  `((lambda () 
     918      ,@(map (lambda (e) 
     919               `(define ,@e)) 
     920             parms) 
     921      ,@bodies))) 
    909922 
    910923(define-builtin-macro (cond . exps) 
  • lang/scheme/3imp/check.scm

    r31636 r31641  
    119119   (apply 
    120120    (apply + 1 2 '(3 4 5))) 
    121  
    122121;;;; INNER 
     122   ;; ��define 
     123   (internal-define 
     124    (begin 
     125      (define hoge 123) 
     126      (begin hoge))) 
     127   ;;  
    123128   (simple-direct-invocation 
    124129    ((lambda (x) (* x x)) 111))