<html><head> <link rel="stylesheet" href="style.css" type="text/css"> <meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"> <link rel="Start" href="pa_monad.html"> <link title="Index of types" rel=Appendix href="pa_monad_types.html"> <link title="Index of exceptions" rel=Appendix href="pa_monad_exceptions.html"> <link title="Index of values" rel=Appendix href="pa_monad_values.html"> <link title="Index of modules" rel=Appendix href="pa_monad_modules.html"> <link title="Pa_monad" rel="Chapter" href="Pa_monad.html"> <link title="Cc" rel="Chapter" href="Cc.html"> <link title="Exception" rel="Chapter" href="Exception.html"> <link title="Io" rel="Chapter" href="Io.html"> <link title="Utest" rel="Chapter" href="Utest.html"><title>Pa_monad.patt_to_recbinding</title> </head> <body> <code class="code"><span class="keyword">let</span> <span class="keyword">rec</span> patt_to_exp (_loc: <span class="constructor">Ast</span>.<span class="constructor">Loc</span>.t) (a_pattern: <span class="constructor">Ast</span>.patt): <span class="constructor">Ast</span>.expr =<br> <span class="keyword">match</span> a_pattern <span class="keyword">with</span><br> <:patt< $int:s$ >> <span class="keywordsign">-></span> <:expr< $int:s$ >> <span class="comment">(* integer constant *)</span><br> <span class="keywordsign">|</span> <:patt< $chr:c$ >> <span class="keywordsign">-></span> <:expr< $chr:c$ >> <span class="comment">(* character constant *)</span><br> <span class="keywordsign">|</span> <:patt< $str:s$ >> <span class="keywordsign">-></span> <:expr< $str:s$ >> <span class="comment">(* string constant *)</span><br> <span class="keywordsign">|</span> <:patt< $lid:b$ >> <span class="keywordsign">-></span> <:expr< $lid:b$ >> <span class="comment">(* local variable *)</span><br> <span class="keywordsign">|</span> <:patt< $uid:b$ >> <span class="keywordsign">-></span> <:expr< $uid:b$ >> <span class="comment">(* variable of other module *)</span><br> <span class="keywordsign">|</span> <:patt< $e1$ $e2$ >> <span class="keywordsign">-></span> <span class="comment">(* function application *)</span><br> <span class="keyword">let</span> p1 = patt_to_exp _loc e1<br> <span class="keyword">and</span> p2 = patt_to_exp _loc e2 <span class="keyword">in</span><br> <:expr< $p1$ $p2$ >><br> <span class="keywordsign">|</span> <:patt< ($tup:p$) >> <span class="keywordsign">-></span> <span class="comment">(* tuple *)</span><br> <span class="keyword">let</span> e = patt_to_exp _loc p <span class="keyword">in</span><br> <:expr< ($tup:e$) >><br> <span class="keywordsign">|</span> <:patt< $p1$, $p2$ >> <span class="keywordsign">-></span><br> <span class="keyword">let</span> e1 = patt_to_exp _loc p1<br> <span class="keyword">and</span> e2 = patt_to_exp _loc p2 <span class="keyword">in</span><br> <:expr< $e1$, $e2$ >><br> <span class="keywordsign">|</span> <:patt< { $r$ } >> <span class="keywordsign">-></span><br> <:expr< { $rec_binding:patt_to_recbinding _loc r$ } >><br> <span class="keywordsign">|</span> <:patt< ($e$ : $t$) >> <span class="keywordsign">-></span> <span class="comment">(* type restriction *)</span><br> <span class="keyword">let</span> p = patt_to_exp _loc e <span class="keyword">in</span><br> <:expr< ($p$ : $t$) >><br> <span class="keywordsign">|</span> _ <span class="keywordsign">-></span><br> <span class="constructor">Loc</span>.raise _loc<br> (<span class="constructor">Stream</span>.<span class="constructor">Error</span> <span class="string">"patt_to_exp: this pattern is not yet supported"</span>)<br> </code><table><tr><td></td><td><span class="comment">(** <code class="code">patt_to_recbinding _loc a_pattern</code> <p> Convert <code class="code">a_pattern</code> to a recursive binding. *)</span></td></tr></table><code class="code"><br> <span class="keyword">and</span> patt_to_recbinding (_loc: <span class="constructor">Ast</span>.<span class="constructor">Loc</span>.t) (a_pattern: <span class="constructor">Ast</span>.patt): <span class="constructor">Ast</span>.rec_binding =<br> <span class="keyword">match</span> a_pattern <span class="keyword">with</span><br> <:patt< >> <span class="keywordsign">-></span> <:rec_binding< >><br> <span class="keywordsign">|</span> <:patt< $i$ = $p$ >> <span class="keywordsign">-></span><br> <span class="keyword">let</span> p = patt_to_exp _loc p <span class="keyword">in</span><br> <:rec_binding< $i$ = $p$ >><br> <span class="keywordsign">|</span> <:patt< $p1$ ; $p2$ >> <span class="keywordsign">-></span><br> <span class="keyword">let</span> b1 = patt_to_recbinding _loc p1<br> <span class="keyword">and</span> b2 = patt_to_recbinding _loc p2 <span class="keyword">in</span><br> <:rec_binding< $b1$; $b2$ >><br> <span class="keywordsign">|</span> <:patt< $anti:_$ >> <span class="keywordsign">-></span><br> <span class="constructor">Loc</span>.raise _loc<br> (<span class="constructor">Stream</span>.<span class="constructor">Error</span> <span class="string">"patt_to_recbinding: antiquotation are not yet supported"</span>)<br> <span class="keywordsign">|</span> _ <span class="keywordsign">-></span><br> <span class="constructor">Loc</span>.raise _loc<br> (<span class="constructor">Stream</span>.<span class="constructor">Error</span> <span class="string">"patt_to_recbinding: never reached"</span>)</code></body></html>