Sophie

Sophie

distrib > Fedora > 17 > i386 > media > updates > by-pkgid > 675c8c8167236dfcf8d66da674f931e8 > files > 117

erlang-doc-R15B-03.3.fc17.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns:fn="http://www.w3.org/2005/02/xpath-functions">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="../otp_doc.css" type="text/css">
<title>Erlang -- Modules</title>
</head>
<body bgcolor="white" text="#000000" link="#0000ff" vlink="#ff00ff" alink="#ff0000"><div id="container">
<script id="js" type="text/javascript" language="JavaScript" src="../js/flipmenu/flipmenu.js"></script><script id="js2" type="text/javascript" src="../js/erlresolvelinks.js"></script><script language="JavaScript" type="text/javascript">
            <!--
              function getWinHeight() {
                var myHeight = 0;
                if( typeof( window.innerHeight ) == 'number' ) {
                  //Non-IE
                  myHeight = window.innerHeight;
                } else if( document.documentElement && ( document.documentElement.clientWidth ||
                                                         document.documentElement.clientHeight ) ) {
                  //IE 6+ in 'standards compliant mode'
                  myHeight = document.documentElement.clientHeight;
                } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
                  //IE 4 compatible
                  myHeight = document.body.clientHeight;
                }
                return myHeight;
              }

              function setscrollpos() {
                var objf=document.getElementById('loadscrollpos');
                 document.getElementById("leftnav").scrollTop = objf.offsetTop - getWinHeight()/2;
              }

              function addEvent(obj, evType, fn){
                if (obj.addEventListener){
                obj.addEventListener(evType, fn, true);
                return true;
              } else if (obj.attachEvent){
                var r = obj.attachEvent("on"+evType, fn);
                return r;
              } else {
                return false;
              }
             }

             addEvent(window, 'load', setscrollpos);

             //--></script><div id="leftnav"><div class="innertube">
<img alt="Erlang logo" src="../erlang-logo.png"><br><small><a href="users_guide.html">User's Guide</a><br><a href="../pdf/otp-system-documentation-5.9.3.1.pdf">PDF</a><br><a href="../index.html">Top</a></small><p><strong>Erlang Reference Manual</strong><br><strong>User's Guide</strong><br><small>Version 5.9.3.1</small></p>
<br><a href="javascript:openAllFlips()">Expand All</a><br><a href="javascript:closeAllFlips()">Contract All</a><p><small><strong>Chapters</strong></small></p>
<ul class="flipMenu" imagepath="../js/flipmenu">
<li id="no" title="Introduction" expanded="false">Introduction<ul>
<li><a href="introduction.html">
              Top of chapter
            </a></li>
<li title="Purpose"><a href="introduction.html#id73748">Purpose</a></li>
<li title="Prerequisites"><a href="introduction.html#id66106">Prerequisites</a></li>
<li title="Document Conventions"><a href="introduction.html#id67296">Document Conventions</a></li>
<li title="Complete List of BIFs"><a href="introduction.html#id68121">Complete List of BIFs</a></li>
<li title="Reserved Words"><a href="introduction.html#id60679">Reserved Words</a></li>
<li title="Character Set"><a href="introduction.html#id61758">Character Set</a></li>
</ul>
</li>
<li id="no" title="Data Types" expanded="false">Data Types<ul>
<li><a href="data_types.html">
              Top of chapter
            </a></li>
<li title="Terms"><a href="data_types.html#id63330">Terms</a></li>
<li title="Number"><a href="data_types.html#id68697">Number</a></li>
<li title="Atom"><a href="data_types.html#id62285">Atom</a></li>
<li title="Bit Strings and Binaries"><a href="data_types.html#id68011">Bit Strings and Binaries</a></li>
<li title="Reference"><a href="data_types.html#id58120">Reference</a></li>
<li title="Fun"><a href="data_types.html#id67499">Fun</a></li>
<li title="Port Identifier"><a href="data_types.html#id69290">Port Identifier</a></li>
<li title="Pid"><a href="data_types.html#id60853">Pid</a></li>
<li title="Tuple"><a href="data_types.html#id73719">Tuple</a></li>
<li title="List"><a href="data_types.html#id73198">List</a></li>
<li title="String"><a href="data_types.html#id68626">String</a></li>
<li title="Record"><a href="data_types.html#id65682">Record</a></li>
<li title="Boolean"><a href="data_types.html#id67471">Boolean</a></li>
<li title="Escape Sequences"><a href="data_types.html#id73885">Escape Sequences</a></li>
<li title="Type Conversions"><a href="data_types.html#id69219">Type Conversions</a></li>
</ul>
</li>
<li id="no" title="Pattern Matching" expanded="false">Pattern Matching<ul>
<li><a href="patterns.html">
              Top of chapter
            </a></li>
<li title="Pattern Matching"><a href="patterns.html#id68202">Pattern Matching</a></li>
</ul>
</li>
<li id="loadscrollpos" title="Modules" expanded="true">Modules<ul>
<li><a href="modules.html">
              Top of chapter
            </a></li>
<li title="Module Syntax"><a href="modules.html#id68326">Module Syntax</a></li>
<li title="Module Attributes"><a href="modules.html#id68358">Module Attributes</a></li>
<li title="Comments"><a href="modules.html#id74337">Comments</a></li>
<li title="The module_info/0 and module_info/1 functions"><a href="modules.html#id74350">The module_info/0 and module_info/1 functions</a></li>
</ul>
</li>
<li id="no" title="Functions" expanded="false">Functions<ul>
<li><a href="functions.html">
              Top of chapter
            </a></li>
<li title="Function Declaration Syntax"><a href="functions.html#id74609">Function Declaration Syntax</a></li>
<li title="Function Evaluation"><a href="functions.html#id74724">Function Evaluation</a></li>
<li title="Tail recursion"><a href="functions.html#id74875">Tail recursion</a></li>
<li title="Built-In Functions, BIFs"><a href="functions.html#id74908">Built-In Functions, BIFs</a></li>
</ul>
</li>
<li id="no" title="Types and Function Specifications" expanded="false">Types and Function Specifications<ul>
<li><a href="typespec.html">
              Top of chapter
            </a></li>
<li title="Introduction of Types"><a href="typespec.html#id75024">Introduction of Types</a></li>
<li title="Types and their Syntax"><a href="typespec.html#id75072">Types and their Syntax</a></li>
<li title="Type declarations of user-defined types"><a href="typespec.html#id75688">Type declarations of user-defined types</a></li>
<li title="Type information in record declarations"><a href="typespec.html#id75770">Type information in record declarations</a></li>
<li title="Specifications for functions"><a href="typespec.html#id75847">Specifications for functions</a></li>
</ul>
</li>
<li id="no" title="Expressions" expanded="false">Expressions<ul>
<li><a href="expressions.html">
              Top of chapter
            </a></li>
<li title="Expression Evaluation"><a href="expressions.html#id76067">Expression Evaluation</a></li>
<li title="Terms"><a href="expressions.html#id76110">Terms</a></li>
<li title="Variables"><a href="expressions.html#id76122">Variables</a></li>
<li title="Patterns"><a href="expressions.html#id76253">Patterns</a></li>
<li title="Match"><a href="expressions.html#id76372">Match</a></li>
<li title="Function Calls"><a href="expressions.html#id76431">Function Calls</a></li>
<li title="If"><a href="expressions.html#id76631">If</a></li>
<li title="Case"><a href="expressions.html#id76696">Case</a></li>
<li title="Send"><a href="expressions.html#id76761">Send</a></li>
<li title="Receive"><a href="expressions.html#id76844">Receive</a></li>
<li title="Term Comparisons"><a href="expressions.html#id77009">Term Comparisons</a></li>
<li title="Arithmetic Expressions"><a href="expressions.html#id77270">Arithmetic Expressions</a></li>
<li title="Boolean Expressions"><a href="expressions.html#id77776">Boolean Expressions</a></li>
<li title="Short-Circuit Expressions"><a href="expressions.html#id77931">Short-Circuit Expressions</a></li>
<li title="List Operations"><a href="expressions.html#id78047">List Operations</a></li>
<li title="Bit Syntax Expressions"><a href="expressions.html#id78116">Bit Syntax Expressions</a></li>
<li title="Fun Expressions"><a href="expressions.html#id78658">Fun Expressions</a></li>
<li title="Catch and Throw"><a href="expressions.html#id78840">Catch and Throw</a></li>
<li title="Try"><a href="expressions.html#id78986">Try</a></li>
<li title="Parenthesized Expressions"><a href="expressions.html#id79344">Parenthesized Expressions</a></li>
<li title="Block Expressions"><a href="expressions.html#id79376">Block Expressions</a></li>
<li title="List Comprehensions"><a href="expressions.html#id79401">List Comprehensions</a></li>
<li title="Bit String Comprehensions"><a href="expressions.html#id79541">Bit String Comprehensions</a></li>
<li title="Guard Sequences"><a href="expressions.html#id79673">Guard Sequences</a></li>
<li title="Operator Precedence"><a href="expressions.html#id80211">Operator Precedence</a></li>
</ul>
</li>
<li id="no" title="The Preprocessor" expanded="false">The Preprocessor<ul>
<li><a href="macros.html">
              Top of chapter
            </a></li>
<li title="File Inclusion"><a href="macros.html#id80530">File Inclusion</a></li>
<li title="Defining and Using Macros"><a href="macros.html#id80659">Defining and Using Macros</a></li>
<li title="Predefined Macros"><a href="macros.html#id80782">Predefined Macros</a></li>
<li title="Macros Overloading"><a href="macros.html#id80850">Macros Overloading</a></li>
<li title="Flow Control in Macros"><a href="macros.html#id80919">Flow Control in Macros</a></li>
<li title="Stringifying Macro Arguments"><a href="macros.html#id81056">Stringifying Macro Arguments</a></li>
</ul>
</li>
<li id="no" title="Records" expanded="false">Records<ul>
<li><a href="records.html">
              Top of chapter
            </a></li>
<li title="Defining Records"><a href="records.html#id81178">Defining Records</a></li>
<li title="Creating Records"><a href="records.html#id81209">Creating Records</a></li>
<li title="Accessing Record Fields"><a href="records.html#id81264">Accessing Record Fields</a></li>
<li title="Updating Records"><a href="records.html#id81303">Updating Records</a></li>
<li title="Records in Guards"><a href="records.html#id81336">Records in Guards</a></li>
<li title="Records in Patterns"><a href="records.html#id81368">Records in Patterns</a></li>
<li title="Nested records"><a href="records.html#id81395">Nested records</a></li>
<li title="Internal Representation of Records"><a href="records.html#id81430">Internal Representation of Records</a></li>
</ul>
</li>
<li id="no" title="Errors and Error Handling" expanded="false">Errors and Error Handling<ul>
<li><a href="errors.html">
              Top of chapter
            </a></li>
<li title="Terminology"><a href="errors.html#id81550">Terminology</a></li>
<li title="Exceptions"><a href="errors.html#id81678">Exceptions</a></li>
<li title="Handling of Run-Time Errors in Erlang"><a href="errors.html#id81851">Handling of Run-Time Errors in Erlang</a></li>
<li title="Exit Reasons"><a href="errors.html#id81913">Exit Reasons</a></li>
</ul>
</li>
<li id="no" title="Processes" expanded="false">Processes<ul>
<li><a href="processes.html">
              Top of chapter
            </a></li>
<li title="Processes"><a href="processes.html#id82387">Processes</a></li>
<li title="Process Creation"><a href="processes.html#id82400">Process Creation</a></li>
<li title="Registered Processes"><a href="processes.html#id82449">Registered Processes</a></li>
<li title="Process Termination"><a href="processes.html#id82560">Process Termination</a></li>
<li title="Message Sending"><a href="processes.html#id82650">Message Sending</a></li>
<li title="Links"><a href="processes.html#id82679">Links</a></li>
<li title="Error Handling"><a href="processes.html#id82744">Error Handling</a></li>
<li title="Monitors"><a href="processes.html#id82854">Monitors</a></li>
<li title="Process Dictionary"><a href="processes.html#id82946">Process Dictionary</a></li>
</ul>
</li>
<li id="no" title="Distributed Erlang" expanded="false">Distributed Erlang<ul>
<li><a href="distributed.html">
              Top of chapter
            </a></li>
<li title="Distributed Erlang System"><a href="distributed.html#id83013">Distributed Erlang System</a></li>
<li title="Nodes"><a href="distributed.html#id83044">Nodes</a></li>
<li title="Node Connections"><a href="distributed.html#id83114">Node Connections</a></li>
<li title="epmd"><a href="distributed.html#id83164">epmd</a></li>
<li title="Hidden Nodes"><a href="distributed.html#id83184">Hidden Nodes</a></li>
<li title="C Nodes"><a href="distributed.html#id83230">C Nodes</a></li>
<li title="Security"><a href="distributed.html#id83254">Security</a></li>
<li title="Distribution BIFs"><a href="distributed.html#id83364">Distribution BIFs</a></li>
<li title="Distribution Command Line Flags"><a href="distributed.html#id83662">Distribution Command Line Flags</a></li>
<li title="Distribution Modules"><a href="distributed.html#id83799">Distribution Modules</a></li>
</ul>
</li>
<li id="no" title="Compilation and Code Loading" expanded="false">Compilation and Code Loading<ul>
<li><a href="code_loading.html">
              Top of chapter
            </a></li>
<li title="Compilation"><a href="code_loading.html#id84002">Compilation</a></li>
<li title="Code Loading"><a href="code_loading.html#id84112">Code Loading</a></li>
<li title="Code Replacement"><a href="code_loading.html#id84159">Code Replacement</a></li>
<li title="Running a function when a module is loaded"><a href="code_loading.html#id84234">Running a function when a module is loaded</a></li>
</ul>
</li>
<li id="no" title="Ports and Port Drivers" expanded="false">Ports and Port Drivers<ul>
<li><a href="ports.html">
              Top of chapter
            </a></li>
<li title="Ports"><a href="ports.html#id84374">Ports</a></li>
<li title="Port Drivers"><a href="ports.html#id84409">Port Drivers</a></li>
<li title="Port BIFs"><a href="ports.html#id84449">Port BIFs</a></li>
</ul>
</li>
</ul>
</div></div>
<div id="content">
<div class="innertube">
<h1>4 Modules</h1>
  

  <h3><a name="id68326">4.1 
        Module Syntax</a></h3>
    
    <p>Erlang code is divided into <strong>modules</strong>. A module consists
      of a sequence of attributes and function declarations, each
      terminated by period (.). Example:</p>
    <div class="example"><pre>
-module(m).          % module attribute
-export([fact/1]).   % module attribute

fact(N) when N&gt;0 -&gt;  % beginning of function declaration
    N * fact(N-1);   %  |
fact(0) -&gt;           %  |
    1.               % end of function declaration</pre></div>
    <p>See the <span class="bold_code"><a href="functions.html">Functions</a></span> chapter
      for a description of function declarations.</p>
  

  <h3><a name="id68358">4.2 
        Module Attributes</a></h3>
    
    <p>A <strong>module attribute</strong> defines a certain property of a
      module. A module attribute consists of a tag and a value.</p>
    <div class="example"><pre>
-Tag(Value).</pre></div>
    <p><span class="code">Tag</span> must be an atom, while <span class="code">Value</span> must be a literal
      term. As a convenience in user-defined attributes, the literal term
      <span class="code">Value</span> the syntax <span class="code">Name/Arity</span>
      (where <span class="code">Name</span> is an atom and <span class="code">Arity</span> a positive integer)
      will be translated to <span class="code">{Name,Arity}</span>.</p>

    <p>Any module attribute can be specified. The attributes are stored
      in the compiled code and can be retrieved by calling
      <span class="code">Module:module_info(attributes)</span> or by using
      <span class="bold_code"><a href="javascript:erlhref('../../','stdlib','beam_lib.html#chunks-2');">beam_lib(3)</a></span>.</p>

    <p>There are several module attributes with predefined meanings,
      some of which have arity two, but user-defined module
      attributes must have arity one.</p>

    <h4>Pre-Defined Module Attributes</h4>
      
      <p>Pre-defined module attributes should be placed before any
        function declaration.</p>
      <dl>
        <dt><strong><span class="code">-module(Module).</span></strong></dt>
        <dd>
          <p>Module declaration, defining the name of the module.
            The name <span class="code">Module</span>, an atom, should be the same as
            the file name minus the extension <span class="code">erl</span>. Otherwise
            <span class="bold_code"><a href="code_loading.html#loading">code loading</a></span> will
            not work as intended.</p>
          <p>This attribute should be specified first and is the only
            attribute which is mandatory.</p>
        </dd>
        <dt><strong><span class="code">-export(Functions).</span></strong></dt>
        <dd>
          <p>Exported functions. Specifies which of the functions
            defined within the module that are visible outside
            the module.</p>
          <p><span class="code">Functions</span> is a list
            <span class="code">[Name1/Arity1, ..., NameN/ArityN]</span>, where each
            <span class="code">NameI</span> is an atom and <span class="code">ArityI</span> an integer.</p>
        </dd>
        <dt><strong><span class="code">-import(Module,Functions).</span></strong></dt>
        <dd>
          <p>Imported functions. Imported functions can be called
            the same way as local functions, that is without any module
            prefix.</p>
          <p><span class="code">Module</span>, an atom, specifies which module to import
            functions from. <span class="code">Functions</span> is a list similar as for
            <span class="code">export</span> above.</p>
        </dd>
        <dt><strong><span class="code">-compile(Options).</span></strong></dt>
        <dd>
          <p>Compiler options. <span class="code">Options</span>, which is a single option
            or a list of options, will be added to the option list when
            compiling the module. See <span class="code">compile(3)</span>.</p>
        </dd>
        <dt><strong><span class="code">-vsn(Vsn).</span></strong></dt>
        <dd>
          <p>Module version. <span class="code">Vsn</span> is any literal term and can be
            retrieved using <span class="code">beam_lib:version/1</span>, see
            <span class="bold_code"><a href="javascript:erlhref('../../','stdlib','beam_lib.html#version-1');">beam_lib(3)</a></span>.</p>
          <p>If this attribute is not specified, the version defaults
            to the MD5 checksum of the module.</p>
        </dd>
        <dt><strong><span class="code">-on_load(Function).</span></strong></dt>
        <dd>
          <p>Names a function that should be run automatically when a
            module a loaded. See <span class="bold_code"><a href="code_loading.html#on_load">
            code loading</a></span> for more information.</p>
        </dd>
      </dl>
    

    <h4>Behaviour Module Attribute</h4>
      
      <p>It is possible to specify that the module is the callback
        module for a <strong>behaviour</strong>:</p>
      <div class="example"><pre>
-behaviour(Behaviour).</pre></div>
      <p>The atom <span class="code">Behaviour</span> gives the name of the behaviour,
        which can be a user defined behaviour or one of the OTP
        standard behaviours <span class="code">gen_server</span>, <span class="code">gen_fsm</span>,
        <span class="code">gen_event</span> or <span class="code">supervisor</span>.</p>
      <p>The spelling <span class="code">behavior</span> is also accepted.</p>
      <p>Read more about behaviours and callback modules in OTP Design
        Principles.</p>
    

    <h4>Record Definitions</h4>
      
      <p>The same syntax as for module attributes is used by
        for record definitions:</p>
      <div class="example"><pre>
-record(Record,Fields).</pre></div>
      <p>Record definitions are allowed anywhere in a module,
        also among the function declarations.
	Read more in <span class="bold_code"><a href="records.html">Records</a></span>.</p>
    

    <h4>The Preprocessor</h4>
      
      <p>The same syntax as for module attributes is used by
        the preprocessor, which supports file inclusion, macros,
	and conditional compilation:</p>
      <div class="example"><pre>
-include("SomeFile.hrl").
-define(Macro,Replacement).</pre></div>

      <p>Read more in <span class="bold_code"><a href="macros.html">The Preprocessor</a></span>.</p>
    

    <h4>Setting File and Line</h4>
      
      <p>The same syntax as for module attributes is used for
        changing the pre-defined macros <span class="code">?FILE</span> and <span class="code">?LINE</span>:</p>
      <div class="example"><pre>
-file(File, Line).</pre></div>
      <p>This attribute is used by tools such as Yecc to inform the
        compiler that the source program was generated by another tool
        and indicates the correspondence of source files to lines of
        the original user-written file from which the source program
        was produced.</p>
    

    <h4>Types and function specifications</h4>
        
	<p>A similar syntax as for module attributes is used for 
	specifying types and function specifications.
	</p>
	<div class="example"><pre>
-type my_type() :: atom() | integer().
-spec my_function(integer()) -&gt; integer().
	</pre></div>
        <p>Read more in <span class="bold_code"><a href="typespec.html">Types and Function specifications</a></span>.
	</p>
	<p>
	  The description is based on
	    <span class="bold_code"><a href="http://www.erlang.org/eeps/eep-0008.html">EEP8 -
	    Types and function specifications</a></span>
	    which will not be further updated.
	</p>
    
  

  <h3><a name="id74337">4.3 
        Comments</a></h3>
    
    <p>Comments may be placed anywhere in a module except within strings
      and quoted atoms. The comment begins with the character "%",
      continues up to, but does not include the next end-of-line, and
      has no effect. Note that the terminating end-of-line has
      the effect of white space.</p>
  

  <h3><a name="id74350">4.4 
        The module_info/0 and module_info/1 functions</a></h3>
    

    <p>The compiler automatically inserts the two special, exported
      functions into each module: <span class="code">Module:module_info/0</span> and
      <span class="code">Module:module_info/1</span>. These functions can be called to
      retrieve information about the module.</p>

    <h4>module_info/0</h4>
      
      <p>The <span class="code">module_info/0</span> function in each module returns
      a list of <span class="code">{Key,Value}</span> tuples with information about
      the module. Currently, the list contain tuples with the following
      <span class="code">Key</span>s: <span class="code">attributes</span>, <span class="code">compile</span>, 
      <span class="code">exports</span>, and <span class="code">imports</span>. The order and number of tuples
      may change without prior notice.</p>

      <div class="warning">
<div class="label">Warning</div>
<div class="content"><p><p>The <span class="code">{imports,Value}</span> tuple may be removed in a future
      release because <span class="code">Value</span> is always an empty list.
      Do not write code that depends on it being present.</p></p></div>
</div>
    

    <h4>module_info/1</h4>
      
      <p>The call <span class="code">module_info(Key)</span>, where key is an atom,
       returns a single piece of information about the module.</p>

      <p>The following values are allowed for <span class="code">Key</span>:</p>

      <dl>
        <dt><strong><span class="code">attributes</span></strong></dt>
	  <dd>
	  <p>Return a list of <span class="code">{AttributeName,ValueList}</span> tuples,
	  where <span class="code">AttributeName</span> is the name of an attribute,
	  and <span class="code">ValueList</span> is a list of values. Note: a given
	  attribute may occur more than once in the list with different
	  values if the attribute occurs more than once in the module.</p>

	  <p>The list of attributes will be empty if
	  the module has been stripped with
	  <span class="bold_code"><a href="javascript:erlhref('../../','stdlib','beam_lib.html#strip-1');">beam_lib(3)</a></span>.</p>
	  </dd>

        <dt><strong><span class="code">compile</span></strong></dt>
	  <dd>
	  <p>Return a list of tuples containing information about
	  how the module was compiled. This list will be empty if
	  the module has been stripped with
	  <span class="bold_code"><a href="javascript:erlhref('../../','stdlib','beam_lib.html#strip-1');">beam_lib(3)</a></span>.</p>
	  </dd>

        <dt><strong><span class="code">imports</span></strong></dt>
	  <dd>
	  <p>Always return an empty list. The <span class="code">imports</span> key may not
	  be supported in future release.</p>
	  </dd>

        <dt><strong><span class="code">exports</span></strong></dt>
	  <dd>
	  <p>Return a list of <span class="code">{Name,Arity}</span> tuples with
	  all exported functions in the module.</p>
	  </dd>

        <dt><strong><span class="code">functions</span></strong></dt>
	  <dd>
	  <p>Return a list of <span class="code">{Name,Arity}</span> tuples with
	  all functions in the module.</p>
	  </dd>
      </dl>
    
  

</div>
<div class="footer">
<hr>
<p>Copyright © 2003-2012 Ericsson AB. All Rights Reserved.</p>
</div>
</div>
</div></body>
</html>