<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta name="robots" content="index,nofollow">



<title>ScopeInference - MLton Standard ML Compiler (SML Compiler)</title>
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="all" href="common.css">
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="screen" href="screen.css">
<link rel="stylesheet" type="text/css" charset="iso-8859-1" media="print" href="print.css">


<link rel="Start" href="Home">


</head>

<body lang="en" dir="ltr">

<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-833377-1";
urchinTracker();
</script>
<table bgcolor = lightblue cellspacing = 0 style = "border: 0px;" width = 100%>
  <tr>
    <td style = "
		border: 0px;
		color: darkblue; 
		font-size: 150%;
		text-align: left;">
      <a class = mltona href="Home">MLton MLTONWIKIVERSION</a>
    <td style = "
		border: 0px;
		font-size: 150%;
		text-align: center;
		width: 50%;">
      ScopeInference
    <td style = "
		border: 0px;
		text-align: right;">
      <table cellspacing = 0 style = "border: 0px">
        <tr style = "vertical-align: middle;">
      </table>
  <tr style = "background-color: white;">
    <td colspan = 3
	style = "
		border: 0px;
		font-size:70%;
		text-align: right;">
      <a href = "Home">Home</a>
      &nbsp;<a href = "Index">Index</a>
      &nbsp;
</table>
<div id="content" lang="en" dir="ltr">
Scope inference is an analysis/rewrite pass for the <a href="AST">AST</a> <a href="IntermediateLanguage">IntermediateLanguage</a>, invoked from <a href="Elaborate">Elaborate</a>. <h2 id="head-55f8ebc805e65b5b71ddafdae390e3be2bcd69af">Description</h2>
<p>
This pass adds free type variables to the <tt>val</tt> or <tt>fun</tt> declaration where they are implicitly scoped. 
</p>
<h2 id="head-8781d615fd77be9578225c40ac67b9471394cced">Implementation</h2>
<p>
<a href = "http://mlton.org/cgi-bin/viewsvn.cgi/mlton/tags/on-MLTONWIKIVERSION-release/mlton/elaborate/scope.sig?view=markup"><img src="moin-www.png" alt="[WWW]" height="11" width="11">scope.sig</a> <a href = "http://mlton.org/cgi-bin/viewsvn.cgi/mlton/tags/on-MLTONWIKIVERSION-release/mlton/elaborate/scope.fun?view=markup"><img src="moin-www.png" alt="[WWW]" height="11" width="11">scope.fun</a> 
</p>
<h2 id="head-35ec00231a68203708e39f0e2cc10b50c6bf62de">Details and Notes</h2>
<p>
Scope inference determines for each type variable, the declaration where it is bound.  Scope inference is a direct implementation of the specification given in section 4.6 of the  <a href="DefinitionOfStandardML"> Definition</a>.  Recall that a free occurrence of a type variable <tt>'a</tt> in a declaration <tt>d</tt> is <em>unguarded</em> in <tt>d</tt> if <tt>'a</tt> is not part of a smaller declaration.  A type variable <tt>'a</tt> is implicitly scoped at <tt>d</tt> if <tt>'a</tt> is unguarded in <tt>d</tt> and <tt>'a</tt> does not occur unguarded in any declaration containing <tt>d</tt>. 
</p>
<p>
The first pass of scope inference walks down the tree and renames all explicitly bound type variables in order to avoid name collisions.  It then walks up the tree and adds to each declaration the set of unguarded type variables occurring in that declaration.  At this point, if declaration <tt>d</tt> contains an unguarded type variable <tt>'a</tt> and the immediately containing declaration does not contain <tt>'a</tt>, then <tt>'a</tt> is implicitly scoped at <tt>d</tt>.  The final pass walks down the tree leaving a <tt>'a</tt> at the a declaration where it is scoped and removing it from all enclosed declarations. 
</p>
</div>



<p>
<hr>
Last edited on 2006-11-02 17:55:41 by <span title="76.16.241.4"><a href="MatthewFluet">MatthewFluet</a></span>.
</body></html>
