@@ -33,7 +33,7 @@
3333 $:
3434 tables=$~([(malt ~[[0 *table]]) 1] (objects table))
3535 global-env=table
36− local-envs=$~(~[(malt ~[['_ENV' table+[0 ~]]])] (list (map name value)))
36+ local-envs=$~(~[(malt ~[['_ENV' table+[0 ~]]])] (lest (map name value)))
3737 ==
3838++ eval-m
3939 |$ [val]
@@ -62,20 +62,26 @@
6262 =<
6363 |= =blok
6464 ^- (eval-m value)
65+ %- with-local
6566 =/ body body.blok
66− ;< ~ bind push-local
6767 |-
6868 ^- (eval-m value)
6969 ?~ body
7070 ?~ ret.blok (pure nil+~)
7171 ?~ u.ret.blok (pure nil+~)
7272 ;< rets=(lest value) bind (eval-exprlist u.u.ret.blok)
73− (pure multires+rets)
73+ (pure (multires rets))
7474 ;< ~ bind (eval-stat i.body)
7575 ;< ret=value bind $(body t.body)
76− ;< ~ bind pop-local
7776 (pure ret)
7877 |%
78+ ++ with-local
79+ |* act=(eval-m)
80+ ^- _act
81+ ;< ~ bind push-local
82+ ;< res=_val:$:act bind act
83+ ;< ~ bind pop-local
84+ (pure res)
7985 ++ push-local
8086 ^- (eval-m ~)
8187 |= st=state
@@ -85,10 +91,15 @@
8591 ^- (eval-m ~)
8692 |= st=state
8793 =. local-envs.st
88− ?~ local-envs.st !!
94+ ?~ t.local-envs.st !!
8995 t.local-envs.st
9096 [st ~]
9197 --
98+++ multires
99+ |= vals=(lest value)
100+ ^- value
101+ ?~ t.vals i.vals
102+ multires+vals
92103++ eval-exprlist
93104 |= vals=exprlist
94105 ^- (eval-m (lest value))
@@ -114,15 +125,31 @@
114125 (set-table ->-.i.asmnts (~(put by tabl) ->+.i.asmnts +.i.asmnts))
115126 ==
116127 $(asmnts t.asmnts)
128+ %local-asmnt
129+ =/ lhs=(list name)
130+ %+ turn attrnamelist.stat
131+ |= [=name attr=(unit attrib)]
132+ ?> ?=(~ attr)
133+ name
134+ ;< actual-values=(list [name value]) bind
135+ ?~ rhs.stat (pure ~)
136+ ;< rhs=(list value) bind (eval-exprlist u.rhs.stat)
137+ (pure (zip lhs rhs))
138+ ;< st=state bind get-state
139+ =. i.local-envs.st
140+ %- ~(uni by i.local-envs.st)
141+ %- malt
142+ (weld (turn lhs |=(=name [name `value`nil+~])) actual-values)
143+ (set-state st)
117144 ==
118145++ set-var
119146 |= var=name
120147 |= val=value
121148 ^- (eval-m ~)
122149 ;< envs=(list (map name value)) bind get-local-envs
123− =/ new-envs=(unit (list (map name value)))
150+ =/ new-envs=(unit (lest (map name value)))
124151 |-
125− ^- (unit (list (map name value)))
152+ ^- (unit (lest (map name value)))
126153 ?~ envs ~
127154 ?. (~(has by i.envs) var)
128155 =/ rest $(envs t.envs)