Changeset 31641 for lang/scheme
- Timestamp:
- 03/28/09 14:05:37 (4 years ago)
- Location:
- lang/scheme/3imp
- Files:
-
- 2 modified
Legend:
- Unmodified
- Added
- Removed
-
lang/scheme/3imp/4.7.scm
r31636 r31641 140 140 (ext-vars (append proper-vars (car e)))) 141 141 (let ((free (cdr e)) ; 上のスコープの自由変数をそのまま引き継ぐ 142 (sets ( find-setses bodies ext-vars))142 (sets (set-union s (find-setses bodies ext-vars))) 143 143 (varnum (if (eq? vars proper-vars) 144 144 (cons (length vars) (length vars)) … … 148 148 (if (null? proper-vars) 149 149 ;; 変数なし(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) 153 152 (let ((c (list* EXPAND (length args2) 154 153 (make-boxes sets proper-vars … … 184 183 next))))) 185 184 186 (define (compile-lambda-bodies vars bodies free sets s last)185 (define (compile-lambda-bodies vars bodies free sets s next) 187 186 (let ((ee (cons vars free)) 188 187 (ss (set-union sets … … 190 189 (recur loop ((p bodies)) 191 190 (if (null? p) 192 last191 next 193 192 (compile (car p) ee ss 194 193 (loop (cdr p))))))) … … 333 332 a) 334 333 (LREF (n . x) 335 (VM (index f n) x f c s))334 (VM (index f n) x f c s)) 336 335 (FREF (n . x) 337 (VM (index-closure c n) x f c s))336 (VM (index-closure c n) x f c s)) 338 337 (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)) 340 339 (UNBOX x 341 (VM (unbox a) x f c s))340 (VM (unbox a) x f c s)) 342 341 (CONST (obj . x) 343 (VM obj x f c s))342 (VM obj x f c s)) 344 343 (CLOSE (argnum n body . x) 345 344 (VM (closure argnum body n s) x f c (- s n))) … … 350 349 (VM a (if a then else) f c s)) 351 350 (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)) 354 353 (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)) 357 356 (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)) 360 359 (CONTI (tail? . x) 361 360 (VM (continuation s tail?) x f c s)) … … 365 364 (VM a x f c (push ret (push f (push c s))))) 366 365 (ARG x 367 (VM a x f c (push a s)))366 (VM a x f c (push a s))) 368 367 (SHIFT (n . x) 369 368 (let ((m (index s (- n 1)))) ; 一つ前の呼び出しの引数の数 … … 372 371 (do-apply argnum a s)) 373 372 (RET () 374 (do-return a s))373 (do-return a s)) 375 374 (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)) 378 377 (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))) 381 380 (else 382 381 (error "unknown opcode" (car x))))) … … 826 825 827 826 (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))))))) 829 846 830 847 (define-special-form (if . all) … … 898 915 899 916 (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))) 909 922 910 923 (define-builtin-macro (cond . exps) -
lang/scheme/3imp/check.scm
r31636 r31641 119 119 (apply 120 120 (apply + 1 2 '(3 4 5))) 121 122 121 ;;;; INNER 122 ;; ��define 123 (internal-define 124 (begin 125 (define hoge 123) 126 (begin hoge))) 127 ;; 123 128 (simple-direct-invocation 124 129 ((lambda (x) (* x x)) 111))
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)