1438
1438
,@(if (eq? lim b) '() `((= ,lim ,b)))
1439
1439
(break-block loop-exit
1440
1440
(_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))))))))))))
1448
1450
1449
1451
; for loop over arbitrary vectors
1450
1452
(pattern-lambda
1455
1457
(block (= ,coll ,X)
1456
1458
(= ,state (call (top start) ,coll))
1457
1459
(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)))))))
1462
1466
1463
1467
; ; update operators
1464
1468
(pattern-lambda (+= a b) (expand-update-operator '+ a b))
1608
1612
(boundscheck pop)
1609
1613
(= ,ri (call (top +) ,ri 1 )))
1610
1614
`(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))))))
1612
1620
1613
1621
; ; Evaluate the comprehension
1614
1622
(let ((loopranges
1618
1626
(scope-block
1619
1627
(block
1620
1628
(local ,oneresult)
1621
- ,@(map (lambda (r ) `(local ,r))
1629
+ # ; ,@(map (lambda (r) `(local ,r))
1622
1630
(apply append (map (lambda (r ) (lhs-vars (cadr r))) ranges)))
1623
1631
(label ,initlabl)
1624
1632
(= ,result (call (top Array)
1661
1669
(= ,result (call (top Array) ,atype ,@(compute-dims rs)))
1662
1670
(scope-block
1663
1671
(block
1664
- ,@(map (lambda (r ) `(local ,r))
1672
+ # ; ,@(map (lambda (r) `(local ,r))
1665
1673
(apply append (map (lambda (r ) (lhs-vars (cadr r))) ranges)))
1666
1674
(= ,ri 1 )
1667
1675
,(construct-loops (reverse ranges) (reverse rs))
1697
1705
(block
1698
1706
(local ,onekey)
1699
1707
(local ,oneval)
1700
- ,@(map (lambda (r ) `(local ,r))
1708
+ # ; ,@(map (lambda (r) `(local ,r))
1701
1709
(apply append (map (lambda (r ) (lhs-vars (cadr r))) ranges)))
1702
1710
(label ,initlabl)
1703
1711
(= ,result (call (curly (top Dict)
1731
1739
(= ,result (call (curly (top Dict) ,(cadr atypes) ,(caddr atypes))))
1732
1740
(scope-block
1733
1741
(block
1734
- ,@(map (lambda (r ) `(local ,r))
1742
+ # ; ,@(map (lambda (r) `(local ,r))
1735
1743
(apply append (map (lambda (r ) (lhs-vars (cadr r))) ranges)))
1736
1744
,(construct-loops (reverse ranges) (reverse rs))
1737
1745
,result)))))))
@@ -2167,6 +2175,16 @@ So far only the second case can actually occur.
2167
2175
(find-local!-decls e env)
2168
2176
(find-assigned-vars e env))))
2169
2177
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
+
2170
2188
; ; local variable identification
2171
2189
; ; convert (scope-block x) to `(scope-block ,@locals ,x)
2172
2190
; ; 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.
2190
2208
(body (add-local-decls (cadr e) (append vars glob env))))
2191
2209
`(scope-block ,@(map (lambda (v ) `(local ,v))
2192
2210
vars)
2193
- ,body)))
2211
+ ,(prn (remove-local-decls (prn body))) )))
2194
2212
(else
2195
2213
; ; form (local! x) adds a local to a normal (non-scope) block
2196
2214
(let ((newenv (append (declared-local!-vars e) env)))
@@ -2272,7 +2290,7 @@ So far only the second case can actually occur.
2272
2290
((eq? (car e) 'lambda ) e)
2273
2291
((eq? (car e) 'scope-block )
2274
2292
(let ((vars (declared-local-vars e))
2275
- (body (car (last-pair e))))
2293
+ (body (cons 'block ( cdr e)))) ; ( car (last-pair e))))
2276
2294
(let* ((outer (append usedv (vars-used-outside context e)))
2277
2295
; ; only rename conflicted vars
2278
2296
(to-ren (filter (lambda (v ) (memq v outer)) vars))
@@ -2368,7 +2386,7 @@ So far only the second case can actually occur.
2368
2386
(if (assq (car vi) captvars)
2369
2387
(vinfo:set-iasg! vi #t )))))
2370
2388
`(= ,(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!))
2372
2390
' (null))
2373
2391
((eq? (car e) 'typeassert )
2374
2392
; (let ((vi (var-info-for (cadr e) env)))
@@ -2569,6 +2587,13 @@ So far only the second case can actually occur.
2569
2587
))
2570
2588
2571
2589
((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 )))
2572
2597
(else (emit (goto-form e))))))
2573
2598
(cond ((or (not (pair? e)) (quoted? e)) e)
2574
2599
((eq? (car e) 'lambda )
0 commit comments