Skip to content

Commit d02f613

Browse files
committed
work towards allocating new bindings per-scope and per-for-loop-iteration
(#1571)
1 parent 57ad9b5 commit d02f613

File tree

1 file changed

+44
-19
lines changed

1 file changed

+44
-19
lines changed

src/julia-syntax.scm

+44-19
Original file line numberDiff line numberDiff line change
@@ -1438,13 +1438,15 @@
14381438
,@(if (eq? lim b) '() `((= ,lim ,b)))
14391439
(break-block loop-exit
14401440
(_while (call (top <=) ,cnt ,lim)
1441-
(block
1442-
(= ,lhs ,cnt)
1443-
(break-block loop-cont
1444-
,body)
1445-
(= ,cnt (call (top convert)
1446-
(call (top typeof) ,cnt)
1447-
(call (top +) 1 ,cnt)))))))))))
1441+
(scope-block
1442+
(block
1443+
(local ,lhs)
1444+
(= ,lhs ,cnt)
1445+
(break-block loop-cont
1446+
,body)
1447+
(= ,cnt (call (top convert)
1448+
(call (top typeof) ,cnt)
1449+
(call (top +) 1 ,cnt))))))))))))
14481450

14491451
; for loop over arbitrary vectors
14501452
(pattern-lambda
@@ -1455,10 +1457,12 @@
14551457
(block (= ,coll ,X)
14561458
(= ,state (call (top start) ,coll))
14571459
(while (call (top !) (call (top done) ,coll ,state))
1458-
(block
1459-
,(lower-tuple-assignment (list lhs state)
1460-
`(call (top next) ,coll ,state))
1461-
,body))))))
1460+
(scope-block
1461+
(block
1462+
,@(map (lambda (v) `(local ,v)) (lhs-vars lhs))
1463+
,(lower-tuple-assignment (list lhs state)
1464+
`(call (top next) ,coll ,state))
1465+
,body)))))))
14621466

14631467
;; update operators
14641468
(pattern-lambda (+= a b) (expand-update-operator '+ a b))
@@ -1608,7 +1612,11 @@
16081612
(boundscheck pop)
16091613
(= ,ri (call (top +) ,ri 1)))
16101614
`(for ,(car ranges)
1611-
,(construct-loops (cdr ranges)))))
1615+
(block
1616+
;; *** either this or force all for loop vars local
1617+
,@(map (lambda (r) `(local ,r))
1618+
(lhs-vars (cadr (car ranges))))
1619+
,(construct-loops (cdr ranges))))))
16121620

16131621
;; Evaluate the comprehension
16141622
(let ((loopranges
@@ -1618,7 +1626,7 @@
16181626
(scope-block
16191627
(block
16201628
(local ,oneresult)
1621-
,@(map (lambda (r) `(local ,r))
1629+
#;,@(map (lambda (r) `(local ,r))
16221630
(apply append (map (lambda (r) (lhs-vars (cadr r))) ranges)))
16231631
(label ,initlabl)
16241632
(= ,result (call (top Array)
@@ -1661,7 +1669,7 @@
16611669
(= ,result (call (top Array) ,atype ,@(compute-dims rs)))
16621670
(scope-block
16631671
(block
1664-
,@(map (lambda (r) `(local ,r))
1672+
#;,@(map (lambda (r) `(local ,r))
16651673
(apply append (map (lambda (r) (lhs-vars (cadr r))) ranges)))
16661674
(= ,ri 1)
16671675
,(construct-loops (reverse ranges) (reverse rs))
@@ -1697,7 +1705,7 @@
16971705
(block
16981706
(local ,onekey)
16991707
(local ,oneval)
1700-
,@(map (lambda (r) `(local ,r))
1708+
#;,@(map (lambda (r) `(local ,r))
17011709
(apply append (map (lambda (r) (lhs-vars (cadr r))) ranges)))
17021710
(label ,initlabl)
17031711
(= ,result (call (curly (top Dict)
@@ -1731,7 +1739,7 @@
17311739
(= ,result (call (curly (top Dict) ,(cadr atypes) ,(caddr atypes))))
17321740
(scope-block
17331741
(block
1734-
,@(map (lambda (r) `(local ,r))
1742+
#;,@(map (lambda (r) `(local ,r))
17351743
(apply append (map (lambda (r) (lhs-vars (cadr r))) ranges)))
17361744
,(construct-loops (reverse ranges) (reverse rs))
17371745
,result)))))))
@@ -2167,6 +2175,16 @@ So far only the second case can actually occur.
21672175
(find-local!-decls e env)
21682176
(find-assigned-vars e env))))
21692177

2178+
(define (remove-local-decls e)
2179+
(cond ((or (not (pair? e)) (quoted? e)) e)
2180+
((or (eq? (car e) 'scope-block) (eq? (car e) 'lambda)) e)
2181+
((eq? (car e) 'block)
2182+
(map remove-local-decls
2183+
(filter (lambda (x) (not (and (pair? x) (eq? (car x) 'local))))
2184+
e)))
2185+
(else
2186+
(map remove-local-decls e))))
2187+
21702188
;; local variable identification
21712189
;; convert (scope-block x) to `(scope-block ,@locals ,x)
21722190
;; where locals is a list of (local x) expressions, derived from two sources:
@@ -2190,7 +2208,7 @@ So far only the second case can actually occur.
21902208
(body (add-local-decls (cadr e) (append vars glob env))))
21912209
`(scope-block ,@(map (lambda (v) `(local ,v))
21922210
vars)
2193-
,body)))
2211+
,(prn (remove-local-decls (prn body))))))
21942212
(else
21952213
;; form (local! x) adds a local to a normal (non-scope) block
21962214
(let ((newenv (append (declared-local!-vars e) env)))
@@ -2272,7 +2290,7 @@ So far only the second case can actually occur.
22722290
((eq? (car e) 'lambda) e)
22732291
((eq? (car e) 'scope-block)
22742292
(let ((vars (declared-local-vars e))
2275-
(body (car (last-pair e))))
2293+
(body (cons 'block (cdr e))));(car (last-pair e))))
22762294
(let* ((outer (append usedv (vars-used-outside context e)))
22772295
;; only rename conflicted vars
22782296
(to-ren (filter (lambda (v) (memq v outer)) vars))
@@ -2368,7 +2386,7 @@ So far only the second case can actually occur.
23682386
(if (assq (car vi) captvars)
23692387
(vinfo:set-iasg! vi #t)))))
23702388
`(= ,(cadr e) ,(analyze-vars (caddr e) env captvars)))
2371-
((or (eq? (car e) 'local) (eq? (car e) 'local!))
2389+
#;((or (eq? (car e) 'local) (eq? (car e) 'local!))
23722390
'(null))
23732391
((eq? (car e) 'typeassert)
23742392
;(let ((vi (var-info-for (cadr e) env)))
@@ -2569,6 +2587,13 @@ So far only the second case can actually occur.
25692587
))
25702588

25712589
((global) #f) ; remove global declarations
2590+
((local local!)
2591+
;; emit (newvar x) where captured locals are introduced.
2592+
(let* ((vname (cadr e))
2593+
(vinf (var-info-for vname vi)))
2594+
(if (and vinf (vinfo:capt vinf))
2595+
(emit `(newvar ,(cadr e)))
2596+
#f)))
25722597
(else (emit (goto-form e))))))
25732598
(cond ((or (not (pair? e)) (quoted? e)) e)
25742599
((eq? (car e) 'lambda)

0 commit comments

Comments
 (0)