getting set! to work
This commit is contained in:
parent
656d950846
commit
b433c6e6c7
|
@ -74,9 +74,12 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(: extend-lexical-environment/names (CompileTimeEnvironment (Listof Symbol) -> CompileTimeEnvironment))
|
(: extend-lexical-environment/names (CompileTimeEnvironment (Listof Symbol) (Listof Boolean) ->
|
||||||
(define (extend-lexical-environment/names cenv names)
|
CompileTimeEnvironment))
|
||||||
(append (map (lambda: ([n : Symbol]) (make-NamedBinding n #f #f)) names) cenv))
|
(define (extend-lexical-environment/names cenv names boxed?)
|
||||||
|
(append (map (lambda: ([n : Symbol]
|
||||||
|
[b : Boolean]) (make-NamedBinding n #f b)) names boxed?)
|
||||||
|
cenv))
|
||||||
|
|
||||||
(: extend-lexical-environment/parameter-names (CompileTimeEnvironment (Listof Symbol) (Listof Boolean) -> CompileTimeEnvironment))
|
(: extend-lexical-environment/parameter-names (CompileTimeEnvironment (Listof Symbol) (Listof Boolean) -> CompileTimeEnvironment))
|
||||||
(define (extend-lexical-environment/parameter-names cenv names boxed?)
|
(define (extend-lexical-environment/parameter-names cenv names boxed?)
|
||||||
|
|
31
parse.rkt
31
parse.rkt
|
@ -385,26 +385,41 @@
|
||||||
[(= 0 (length vars))
|
[(= 0 (length vars))
|
||||||
(parse `(begin ,@body) cenv)]
|
(parse `(begin ,@body) cenv)]
|
||||||
[(= 1 (length vars))
|
[(= 1 (length vars))
|
||||||
(make-Let1 (parameterize ([current-defined-name (first vars)])
|
(let* ([mutated? (and (member (first vars) (find-mutated-names `(begin ,@body))) #t)]
|
||||||
(parse (car rhss) (extend-lexical-environment/placeholders cenv 1)))
|
[let-body (parse `(begin ,@body)
|
||||||
(parse `(begin ,@body)
|
(extend-lexical-environment/names
|
||||||
(extend-lexical-environment/names cenv (list (first vars)))))]
|
cenv
|
||||||
|
(list (first vars))
|
||||||
|
(list mutated?)))])
|
||||||
|
(make-Let1 (parameterize ([current-defined-name (first vars)])
|
||||||
|
(parse (car rhss) (extend-lexical-environment/placeholders cenv 1)))
|
||||||
|
(if mutated?
|
||||||
|
(make-BoxEnv 0 let-body)
|
||||||
|
let-body)))]
|
||||||
[else
|
[else
|
||||||
(let ([rhs-cenv (extend-lexical-environment/placeholders cenv (length vars))])
|
(let* ([rhs-cenv (extend-lexical-environment/placeholders cenv (length vars))]
|
||||||
|
[mutated (find-mutated-names `(begin ,@body))]
|
||||||
|
[any-mutated? (ormap (lambda (n) (and (member n mutated) #t)) vars)])
|
||||||
(make-LetVoid (length vars)
|
(make-LetVoid (length vars)
|
||||||
(seq (append
|
(seq (append
|
||||||
(map (lambda (var rhs index)
|
(map (lambda (var rhs index)
|
||||||
(make-InstallValue index
|
(make-InstallValue index
|
||||||
(parameterize ([current-defined-name var])
|
(parameterize ([current-defined-name var])
|
||||||
(parse rhs rhs-cenv))
|
(parse rhs rhs-cenv))
|
||||||
#f))
|
any-mutated?))
|
||||||
vars
|
vars
|
||||||
rhss
|
rhss
|
||||||
(build-list (length rhss) (lambda (i) i)))
|
(build-list (length rhss) (lambda (i) i)))
|
||||||
(list (parse `(begin ,@body)
|
(list (parse `(begin ,@body)
|
||||||
(extend-lexical-environment/names cenv vars)))))
|
(extend-lexical-environment/names
|
||||||
#f))])))
|
cenv vars
|
||||||
|
(build-list (length vars)
|
||||||
|
(lambda (i)
|
||||||
|
any-mutated?)))))))
|
||||||
|
any-mutated?))])))
|
||||||
|
|
||||||
|
|
||||||
|
;; Letrec's currently doing a set! kind of thing.
|
||||||
(define (parse-letrec exp cenv)
|
(define (parse-letrec exp cenv)
|
||||||
(let ([vars (let-variables exp)]
|
(let ([vars (let-variables exp)]
|
||||||
[rhss (let-rhss exp)]
|
[rhss (let-rhss exp)]
|
||||||
|
|
|
@ -309,3 +309,37 @@
|
||||||
(make-App (make-LocalRef 1 #t)
|
(make-App (make-LocalRef 1 #t)
|
||||||
(list (make-LocalRef 2 #t)))))
|
(list (make-LocalRef 2 #t)))))
|
||||||
#t)))
|
#t)))
|
||||||
|
|
||||||
|
(test (parse '(let ([x 0])
|
||||||
|
(lambda ()
|
||||||
|
(set! x (add1 x)))))
|
||||||
|
(make-Top (make-Prefix '(add1))
|
||||||
|
(make-Let1 (make-Constant 0)
|
||||||
|
(make-BoxEnv 0
|
||||||
|
(make-Lam #f 0
|
||||||
|
(make-InstallValue
|
||||||
|
1
|
||||||
|
(make-App (make-ToplevelRef 1 0)
|
||||||
|
(list (make-LocalRef 2 #t)))
|
||||||
|
#t)
|
||||||
|
'(1 0)))))) ;; x is 0, prefix is 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(test (parse '(let ([x 0]
|
||||||
|
[y 1])
|
||||||
|
(lambda ()
|
||||||
|
(set! x (add1 x)))))
|
||||||
|
(make-Top (make-Prefix '(add1))
|
||||||
|
(make-LetVoid 2
|
||||||
|
(make-Seq (list
|
||||||
|
(make-InstallValue 0 (make-Constant 0) #t)
|
||||||
|
(make-InstallValue 1 (make-Constant 1) #t)
|
||||||
|
(make-Lam #f 0
|
||||||
|
(make-InstallValue
|
||||||
|
1
|
||||||
|
(make-App (make-ToplevelRef 1 0)
|
||||||
|
(list (make-LocalRef 2 #t)))
|
||||||
|
#t)
|
||||||
|
'(2 0))))
|
||||||
|
#t)))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user