@@ -17,6 +17,7 @@ include "mexpr/cmp.mc"
1717include " mexpr/eq.mc"
1818include " mexpr/eval.mc"
1919include " mexpr/pprint.mc"
20+ include " mexpr/resymbolize.mc"
2021include " mexpr/symbolize.mc"
2122include " mexpr/type.mc"
2223include " mexpr/type-check.mc"
@@ -207,129 +208,6 @@ lang MonomorphizeInstantiate = Monomorphize
207208 | ty - > smap_Type_Type (instantiatePolymorphicType inst ) ty
208209end
209210
210- lang MonomorphizeResymbolize = Monomorphize
211- -- Resymbolizes all variables bound inside the provided expression . We use
212- -- this to ensure function definitions duplicated due to monomorphization end
213- -- up with distinct symbols .
214- sem resymbolizeBindings : Expr - > Expr
215- sem resymbolizeBindings =
216- | ast - > resymbolizeBindingsExpr (mapEmpty nameCmp ) ast
217-
218- sem resymbolizeBindingsDecl : Map Name Name - > Decl - > (Map Name Name , Decl )
219- sem resymbolizeBindingsDecl nameMap =
220- | d - > (nameMap , smap_Decl_Expr (resymbolizeBindingsExpr nameMap ) d )
221- | DeclLet t - >
222- let body = resymbolizeBindingsExpr nameMap t .body in
223- let newId = nameSetNewSym t .ident in
224- let nameMap = mapInsert t .ident newId nameMap in
225- ( nameMap
226- , DeclLet
227- { t with ident = newId
228- , tyAnnot = resymbolizeBindingsType nameMap t.tyAnnot
229- , tyBody = resymbolizeBindingsType nameMap t.tyBody
230- , body = body
231- }
232- )
233- | DeclRecLets t - >
234- let addNewIdBinding = lam nameMap . lam bind .
235- let newId = nameSetNewSym bind .ident in
236- (mapInsert bind .ident newId nameMap , {bind with ident = newId})
237- in
238- match mapAccumL addNewIdBinding nameMap t .bindings with (nameMap , bindings ) in
239- let resymbolizeBind = lam bind .
240- {bind with tyAnnot = resymbolizeBindingsType nameMap bind .tyAnnot ,
241- tyBody = resymbolizeBindingsType nameMap bind .tyBody ,
242- body = resymbolizeBindingsExpr nameMap bind .body }
243- in
244- let bindings = map resymbolizeBind bindings in
245- (nameMap , DeclRecLets {t with bindings = bindings})
246- | DeclType t - >
247- let newId = nameSetNewSym t .ident in
248- let nameMap = mapInsert t .ident newId nameMap in
249- ( nameMap
250- , DeclType
251- { t with ident = newId
252- , tyIdent = resymbolizeBindingsType nameMap t.tyIdent
253- }
254- )
255- | DeclConDef t - >
256- let newId = nameSetNewSym t .ident in
257- let nameMap = mapInsert t .ident newId nameMap in
258- (nameMap , DeclConDef {t with ident = newId, tyIdent = resymbolizeBindingsType nameMap t.tyIdent})
259-
260- sem resymbolizeBindingsExpr : Map Name Name - > Expr - > Expr
261- sem resymbolizeBindingsExpr nameMap =
262- | TmVar t - >
263- let newId =
264- match mapLookup t .ident nameMap with Some newId then newId
265- else t .ident
266- in
267- TmVar {t with ident = newId , ty = resymbolizeBindingsType nameMap t .ty }
268- | TmLam t - >
269- let newId = nameSetNewSym t .ident in
270- let nameMap = mapInsert t .ident newId nameMap in
271- TmLam {t with ident = newId ,
272- tyAnnot = resymbolizeBindingsType nameMap t .tyAnnot ,
273- tyParam = resymbolizeBindingsType nameMap t .tyParam ,
274- body = resymbolizeBindingsExpr nameMap t .body ,
275- ty = resymbolizeBindingsType nameMap t .ty }
276- | TmDecl t - >
277- match resymbolizeBindingsDecl nameMap t .decl with (nameMap , decl ) in
278- let inexpr = resymbolizeBindingsExpr nameMap t .inexpr in
279- TmDecl {t with decl = decl , inexpr = inexpr }
280- | TmConApp t - >
281- let newId =
282- match mapLookup t .ident nameMap with Some newId then newId
283- else t .ident
284- in
285- TmConApp {t with ident = newId ,
286- body = resymbolizeBindingsExpr nameMap t .body ,
287- ty = resymbolizeBindingsType nameMap t .ty }
288- | TmMatch t - >
289- let target = resymbolizeBindingsExpr nameMap t .target in
290- match resymbolizeBindingsPat nameMap t .pat with (thnNameMap , pat ) in
291- TmMatch {t with target = target , pat = pat ,
292- thn = resymbolizeBindingsExpr thnNameMap t .thn ,
293- els = resymbolizeBindingsExpr nameMap t .els ,
294- ty = resymbolizeBindingsType nameMap t .ty }
295- | t - >
296- let t = smap_Expr_Expr (resymbolizeBindingsExpr nameMap ) t in
297- let t = smap_Expr_Type (resymbolizeBindingsType nameMap ) t in
298- let t = smap_Expr_TypeLabel (resymbolizeBindingsType nameMap ) t in
299- withType (resymbolizeBindingsType nameMap (tyTm t )) t
300-
301- sem resymbolizeBindingsPat : Map Name Name - > Pat - > (Map Name Name , Pat )
302- sem resymbolizeBindingsPat nameMap =
303- | PatNamed (t & {ident = PName id}) - >
304- let newId = nameSetNewSym id in
305- (mapInsert id newId nameMap , PatNamed {t with ident = PName newId})
306- | PatSeqEdge (t & {middle = PName id}) - >
307- let newId = nameSetNewSym id in
308- (mapInsert id newId nameMap , PatSeqEdge {t with middle = PName newId})
309- | PatCon t - >
310- match mapLookup t .ident nameMap with Some newId then
311- (nameMap , PatCon {t with ident = newId})
312- else (nameMap , PatCon t )
313- | p - > smapAccumL_Pat_Pat resymbolizeBindingsPat nameMap p
314-
315- sem resymbolizeBindingsType : Map Name Name - > Type - > Type
316- sem resymbolizeBindingsType nameMap =
317- | TyCon t - >
318- match mapLookup t .ident nameMap with Some newId then
319- TyCon {t with ident = newId }
320- else TyCon t
321- | TyVar t - >
322- match mapLookup t .ident nameMap with Some newId then
323- TyVar {t with ident = newId }
324- else TyVar t
325- | TyAll t - >
326- let newId = nameSetNewSym t .ident in
327- let nameMap = mapInsert t .ident newId nameMap in
328- TyAll {t with ident = newId ,
329- ty = resymbolizeBindingsType nameMap t .ty }
330- | ty - > smap_Type_Type (resymbolizeBindingsType nameMap ) ty
331- end
332-
333211lang MonomorphizeCollect =
334212 MonomorphizeValidate + MonomorphizeInstantiate + MExprCallGraph + AppTypeUtils
335213
@@ -618,7 +496,7 @@ lang MonomorphizeCollect =
618496 | ty - > monoError [infoTy ty ] " Constructor type does not refer to a known variant type"
619497end
620498
621- lang MonomorphizeApply = MonomorphizeInstantiate + MonomorphizeResymbolize + AppTypeUtils
499+ lang MonomorphizeApply = MonomorphizeInstantiate + MExprResymbolize + AppTypeUtils
622500 -- Replaces polymorphic constructs with their monomorphic bindings
623501 -- based on the provided monomorphization environment (bottom - up ).
624502 sem applyMonomorphization : MonoEnv - > Expr - > Expr
0 commit comments