Skip to content

Instantly share code, notes, and snippets.

@hc5
Created March 24, 2012 13:03
Show Gist options
  • Select an option

  • Save hc5/2182534 to your computer and use it in GitHub Desktop.

Select an option

Save hc5/2182534 to your computer and use it in GitHub Desktop.
| Let(dec1::decs, e2) => (case dec1 of
Val(expr,name) => if name = x then
Let(Val(subst s expr,name)::decs,e2)
else
let
val (varName,Let(rnDecs, rnExpr)) = if member name (freeVars e')
then rename (name,Let(decs, e2)) else (name,Let(decs, e2))
val Let(subDecs,subExpr) = subst s (Let(rnDecs, rnExpr))
in
Let(Val(subst s expr,varName)::subDecs,subExpr)
end
|ByName(expr,name) => if name = x then
Let(ByName(subst s expr,name)::decs,e2)
else
let
val (varName,Let(rnDecs, rnExpr)) = if member name (freeVars e')
then rename (name,Let(decs, e2)) else (name,Let(decs, e2))
val Let(subDecs,subExpr) = subst s (Let(rnDecs, rnExpr))
in
Let(ByName(subst s expr,varName)::subDecs,subExpr)
end
|Valtuple(expr,li) => if List.exists (fn name=>name=x) li then
Let(Valtuple(subst s expr,li)::decs,e2)
else
let
val (rnLi,Let(rnDecs, rnExpr)) = List.foldl (fn (name',(l,Let(d,e)))=>
let
val (varName,Let(d',e')) = if member name' (freeVars e')
then rename (name',Let(decs,e2)) else (name',Let(decs, e2))
in
(l@[varName],Let(d',e'))
end) ([],Let(decs,e2)) li
val Let(subDecs,subExpr) = subst s (Let(rnDecs, rnExpr))
in
Let(Valtuple(subst s expr,rnLi)::subDecs,subExpr)
end)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment