emacs.d/clones/scheme/docs.racket-lang.org/guide/unit_versus_module.html
2022-09-30 11:00:09 +02:00

36 lines
No EOL
18 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=0.8"/><title>14.7&nbsp;unit versus module</title><link rel="stylesheet" type="text/css" href="../scribble.css" title="default"/><link rel="stylesheet" type="text/css" href="../racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-style.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../manual-racket.css" title="default"/><link rel="stylesheet" type="text/css" href="../doc-site.css" title="default"/><script type="text/javascript" src="../scribble-common.js"></script><script type="text/javascript" src="../manual-racket.js"></script><script type="text/javascript" src="../manual-racket.js"></script><script type="text/javascript" src="../doc-site.js"></script><script type="text/javascript" src="../local-redirect/local-redirect.js"></script><script type="text/javascript" src="../local-redirect/local-user-redirect.js"></script><!--[if IE 6]><style type="text/css">.SIEHidden { overflow: hidden; }</style><![endif]--></head><body id="doc-racket-lang-org"><div class="tocset"><div class="tocview"><div class="tocviewlist tocviewlisttopspace"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,&quot;tocview_0&quot;);">&#9658;</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">The Racket Guide</a></td></tr></table></div><div class="tocviewsublisttop" style="display: none;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1&nbsp;</td><td><a href="intro.html" class="tocviewlink" data-pltdoc="x">Welcome to Racket</a></td></tr><tr><td align="right">2&nbsp;</td><td><a href="to-scheme.html" class="tocviewlink" data-pltdoc="x">Racket Essentials</a></td></tr><tr><td align="right">3&nbsp;</td><td><a href="datatypes.html" class="tocviewlink" data-pltdoc="x">Built-<wbr></wbr>In Datatypes</a></td></tr><tr><td align="right">4&nbsp;</td><td><a href="scheme-forms.html" class="tocviewlink" data-pltdoc="x">Expressions and Definitions</a></td></tr><tr><td align="right">5&nbsp;</td><td><a href="define-struct.html" class="tocviewlink" data-pltdoc="x">Programmer-<wbr></wbr>Defined Datatypes</a></td></tr><tr><td align="right">6&nbsp;</td><td><a href="modules.html" class="tocviewlink" data-pltdoc="x">Modules</a></td></tr><tr><td align="right">7&nbsp;</td><td><a href="contracts.html" class="tocviewlink" data-pltdoc="x">Contracts</a></td></tr><tr><td align="right">8&nbsp;</td><td><a href="i_o.html" class="tocviewlink" data-pltdoc="x">Input and Output</a></td></tr><tr><td align="right">9&nbsp;</td><td><a href="regexp.html" class="tocviewlink" data-pltdoc="x">Regular Expressions</a></td></tr><tr><td align="right">10&nbsp;</td><td><a href="control.html" class="tocviewlink" data-pltdoc="x">Exceptions and Control</a></td></tr><tr><td align="right">11&nbsp;</td><td><a href="for.html" class="tocviewlink" data-pltdoc="x">Iterations and Comprehensions</a></td></tr><tr><td align="right">12&nbsp;</td><td><a href="match.html" class="tocviewlink" data-pltdoc="x">Pattern Matching</a></td></tr><tr><td align="right">13&nbsp;</td><td><a href="classes.html" class="tocviewlink" data-pltdoc="x">Classes and Objects</a></td></tr><tr><td align="right">14&nbsp;</td><td><a href="units.html" class="tocviewselflink" data-pltdoc="x">Units</a></td></tr><tr><td align="right">15&nbsp;</td><td><a href="reflection.html" class="tocviewlink" data-pltdoc="x">Reflection and Dynamic Evaluation</a></td></tr><tr><td align="right">16&nbsp;</td><td><a href="macros.html" class="tocviewlink" data-pltdoc="x">Macros</a></td></tr><tr><td align="right">17&nbsp;</td><td><a href="languages.html" class="tocviewlink" data-pltdoc="x">Creating Languages</a></td></tr><tr><td align="right">18&nbsp;</td><td><a href="concurrency.html" class="tocviewlink" data-pltdoc="x">Concurrency and Synchronization</a></td></tr><tr><td align="right">19&nbsp;</td><td><a href="performance.html" class="tocviewlink" data-pltdoc="x">Performance</a></td></tr><tr><td align="right">20&nbsp;</td><td><a href="parallelism.html" class="tocviewlink" data-pltdoc="x">Parallelism</a></td></tr><tr><td align="right">21&nbsp;</td><td><a href="running.html" class="tocviewlink" data-pltdoc="x">Running and Creating Executables</a></td></tr><tr><td align="right">22&nbsp;</td><td><a href="More_Libraries.html" class="tocviewlink" data-pltdoc="x">More Libraries</a></td></tr><tr><td align="right">23&nbsp;</td><td><a href="dialects.html" class="tocviewlink" data-pltdoc="x">Dialects of Racket and Scheme</a></td></tr><tr><td align="right">24&nbsp;</td><td><a href="other-editors.html" class="tocviewlink" data-pltdoc="x">Command-<wbr></wbr>Line Tools and Your Editor of Choice</a></td></tr><tr><td align="right"></td><td><a href="doc-bibliography.html" class="tocviewlink" data-pltdoc="x">Bibliography</a></td></tr><tr><td align="right"></td><td><a href="doc-index.html" class="tocviewlink" data-pltdoc="x">Index</a></td></tr></table></div></div><div class="tocviewlist"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,&quot;tocview_1&quot;);">&#9660;</a></td><td>14&nbsp;</td><td><a href="units.html" class="tocviewlink" data-pltdoc="x">Units</a></td></tr></table><div class="tocviewsublistbottom" style="display: block;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right">14.1&nbsp;</td><td><a href="Signatures_and_Units.html" class="tocviewlink" data-pltdoc="x">Signatures and Units</a></td></tr><tr><td align="right">14.2&nbsp;</td><td><a href="Invoking_Units.html" class="tocviewlink" data-pltdoc="x">Invoking Units</a></td></tr><tr><td align="right">14.3&nbsp;</td><td><a href="Linking_Units.html" class="tocviewlink" data-pltdoc="x">Linking Units</a></td></tr><tr><td align="right">14.4&nbsp;</td><td><a href="firstclassunits.html" class="tocviewlink" data-pltdoc="x">First-<wbr></wbr>Class Units</a></td></tr><tr><td align="right">14.5&nbsp;</td><td><a href="Whole-module_Signatures_and_Units.html" class="tocviewlink" data-pltdoc="x">Whole-<span class="RktSym"><span class="RktStxLink">module</span></span> Signatures and Units</a></td></tr><tr><td align="right">14.6&nbsp;</td><td><a href="Contracts_for_Units.html" class="tocviewlink" data-pltdoc="x">Contracts for Units</a></td></tr><tr><td align="right">14.7&nbsp;</td><td><a href="unit_versus_module.html" class="tocviewselflink" data-pltdoc="x"><span class="RktSym"><span class="RktStxLink">unit</span></span> versus <span class="RktSym"><span class="RktStxLink">module</span></span></a></td></tr></table></div></div></div></div><div class="maincolumn"><div class="main"><div class="navsettop"><span class="navleft"><form class="searchform"><input class="searchbox" id="searchbox" type="text" tabindex="1" placeholder="...search manuals..." title="Enter a search string to search the manuals" onkeypress="return DoSearchKey(event, this, &quot;8.6&quot;, &quot;../&quot;);"/></form>&nbsp;&nbsp;<a href="https://docs.racket-lang.org/index.html" title="up to the documentation top" data-pltdoc="x" onclick="return GotoPLTRoot(&quot;8.6&quot;);">top</a><span class="tocsettoggle">&nbsp;&nbsp;<a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright">&nbsp;&nbsp;<a href="Contracts_for_Units.html" title="backward to &quot;14.6 Contracts for Units&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="units.html" title="up to &quot;14 Units (Components)&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="reflection.html" title="forward to &quot;15 Reflection and Dynamic Evaluation&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div><h4 x-source-module="(lib &quot;scribblings/guide/guide.scrbl&quot;)" x-source-pkg="racket-doc" x-part-tag="&quot;unit_versus_module&quot;">14.7<tt>&nbsp;</tt><a name="(part._unit_versus_module)"></a><span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=creatingunits.html%23%2528form._%2528%2528lib._racket%252Funit..rkt%2529._unit%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">unit</a></span> versus <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=module.html%23%2528form._%2528%2528quote._%7E23%7E25kernel%2529._module%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">module</a></span></h4><p>As a form for modularity, <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=creatingunits.html%23%2528form._%2528%2528lib._racket%252Funit..rkt%2529._unit%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">unit</a></span> complements <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=module.html%23%2528form._%2528%2528quote._%7E23%7E25kernel%2529._module%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">module</a></span>:</p><ul><li><p>The <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=module.html%23%2528form._%2528%2528quote._%7E23%7E25kernel%2529._module%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">module</a></span> form is primarily for managing a universal
namespace. For example, it allows a code fragment to refer
specifically to the <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=pairs.html%23%2528def._%2528%2528quote._%7E23%7E25kernel%2529._car%2529%2529&amp;version=8.6" class="RktValLink Sq" data-pltdoc="x">car</a></span> operation from
<a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=index.html&amp;version=8.6" class="RktModLink Sq" data-pltdoc="x"><span class="RktSym">racket/base</span></a>&#8212;<wbr></wbr>the one that extracts the first
element of an instance of the built-in pair datatype&#8212;<wbr></wbr>as
opposed to any number of other functions with the name
<span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=pairs.html%23%2528def._%2528%2528quote._%7E23%7E25kernel%2529._car%2529%2529&amp;version=8.6" class="RktValLink Sq" data-pltdoc="x">car</a></span>. In other words, the <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=module.html%23%2528form._%2528%2528quote._%7E23%7E25kernel%2529._module%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">module</a></span> construct lets
you refer to <span class="emph">the</span> binding that you want.</p></li><li><p>The <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=creatingunits.html%23%2528form._%2528%2528lib._racket%252Funit..rkt%2529._unit%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">unit</a></span> form is for parameterizing a code fragment
with respect to most any kind of run-time value. For example,
it allows a code fragment to work with a <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=pairs.html%23%2528def._%2528%2528quote._%7E23%7E25kernel%2529._car%2529%2529&amp;version=8.6" class="RktValLink Sq" data-pltdoc="x">car</a></span>
function that accepts a single argument, where the specific
function is determined later by linking the fragment to
another. In other words, the <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=creatingunits.html%23%2528form._%2528%2528lib._racket%252Funit..rkt%2529._unit%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">unit</a></span> construct lets you
refer to <span class="emph">a</span> binding that meets some specification.</p></li></ul><p>The <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=lambda.html%23%2528form._%2528%2528lib._racket%252Fprivate%252Fbase..rkt%2529._lambda%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">lambda</a></span> and <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=createclass.html%23%2528form._%2528%2528lib._racket%252Fprivate%252Fclass-internal..rkt%2529._class%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">class</a></span> forms, among others, also allow
parameterization of code with respect to values that are chosen
later. In principle, any of those could be implemented in terms of any
of the others. In practice, each form offers certain
conveniences&#8212;<wbr></wbr>such as allowing overriding of methods or especially
simple application to values&#8212;<wbr></wbr>that make them suitable for different
purposes.</p><p>The <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=module.html%23%2528form._%2528%2528quote._%7E23%7E25kernel%2529._module%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">module</a></span> form is more fundamental than the others, in a
sense. After all, a program fragment cannot reliably refer to a
<span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=lambda.html%23%2528form._%2528%2528lib._racket%252Fprivate%252Fbase..rkt%2529._lambda%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">lambda</a></span>, <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=createclass.html%23%2528form._%2528%2528lib._racket%252Fprivate%252Fclass-internal..rkt%2529._class%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">class</a></span>, or <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=creatingunits.html%23%2528form._%2528%2528lib._racket%252Funit..rkt%2529._unit%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">unit</a></span> form without the
namespace management provided by <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=module.html%23%2528form._%2528%2528quote._%7E23%7E25kernel%2529._module%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">module</a></span>. At the same time,
because namespace management is closely related to separate expansion
and compilation, <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=module.html%23%2528form._%2528%2528quote._%7E23%7E25kernel%2529._module%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">module</a></span> boundaries end up as
separate-compilation boundaries in a way that prohibits mutual
dependencies among fragments. For similar reasons, <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=module.html%23%2528form._%2528%2528quote._%7E23%7E25kernel%2529._module%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">module</a></span>
does not separate interface from implementation.</p><p>Use <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=creatingunits.html%23%2528form._%2528%2528lib._racket%252Funit..rkt%2529._unit%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">unit</a></span> when <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=module.html%23%2528form._%2528%2528quote._%7E23%7E25kernel%2529._module%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">module</a></span> by itself almost works, but
when separately compiled pieces must refer to each other, or when you
want a stronger separation between <span style="font-style: italic">interface</span> (i.e., the
parts that need to be known at expansion and compilation time) and
<span style="font-style: italic">implementation</span> (i.e., the run-time parts). More generally,
use <span class="RktSym"><a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=reference&amp;rel=creatingunits.html%23%2528form._%2528%2528lib._racket%252Funit..rkt%2529._unit%2529%2529&amp;version=8.6" class="RktStxLink Sq" data-pltdoc="x">unit</a></span> when you need to parameterize code over functions,
datatypes, and classes, and when the parameterized code itself
provides definitions to be linked with other parameterized code.</p><div class="navsetbottom"><span class="navleft"><form class="searchform"><input class="searchbox" id="searchbox" type="text" tabindex="1" placeholder="...search manuals..." title="Enter a search string to search the manuals" onkeypress="return DoSearchKey(event, this, &quot;8.6&quot;, &quot;../&quot;);"/></form>&nbsp;&nbsp;<a href="https://docs.racket-lang.org/index.html" title="up to the documentation top" data-pltdoc="x" onclick="return GotoPLTRoot(&quot;8.6&quot;);">top</a><span class="tocsettoggle">&nbsp;&nbsp;<a href="javascript:void(0);" title="show/hide table of contents" onclick="TocsetToggle();">contents</a></span></span><span class="navright">&nbsp;&nbsp;<a href="Contracts_for_Units.html" title="backward to &quot;14.6 Contracts for Units&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="units.html" title="up to &quot;14 Units (Components)&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="reflection.html" title="forward to &quot;15 Reflection and Dynamic Evaluation&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div></div></div><div id="contextindicator">&nbsp;</div></body></html>