324 lines
340 KiB
HTML
324 lines
340 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>6.2 Creating Classes</title><link rel="stylesheet" type="text/css" href="../scribble.css" title="default"/><link rel="stylesheet" type="text/css" href="extras.css" title="default"/><link rel="stylesheet" type="text/css" href="icons.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,"tocview_0");">►</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">The Racket Reference</a></td></tr></table></div><div class="tocviewsublisttop" style="display: none;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1 </td><td><a href="model.html" class="tocviewlink" data-pltdoc="x">Language Model</a></td></tr><tr><td align="right">2 </td><td><a href="notation.html" class="tocviewlink" data-pltdoc="x">Notation for Documentation</a></td></tr><tr><td align="right">3 </td><td><a href="syntax.html" class="tocviewlink" data-pltdoc="x">Syntactic Forms</a></td></tr><tr><td align="right">4 </td><td><a href="data.html" class="tocviewlink" data-pltdoc="x">Datatypes</a></td></tr><tr><td align="right">5 </td><td><a href="structures.html" class="tocviewlink" data-pltdoc="x">Structures</a></td></tr><tr><td align="right">6 </td><td><a href="mzlib_class.html" class="tocviewselflink" data-pltdoc="x">Classes and Objects</a></td></tr><tr><td align="right">7 </td><td><a href="mzlib_unit.html" class="tocviewlink" data-pltdoc="x">Units</a></td></tr><tr><td align="right">8 </td><td><a href="contracts.html" class="tocviewlink" data-pltdoc="x">Contracts</a></td></tr><tr><td align="right">9 </td><td><a href="match.html" class="tocviewlink" data-pltdoc="x">Pattern Matching</a></td></tr><tr><td align="right">10 </td><td><a href="control.html" class="tocviewlink" data-pltdoc="x">Control Flow</a></td></tr><tr><td align="right">11 </td><td><a href="concurrency.html" class="tocviewlink" data-pltdoc="x">Concurrency and Parallelism</a></td></tr><tr><td align="right">12 </td><td><a href="Macros.html" class="tocviewlink" data-pltdoc="x">Macros</a></td></tr><tr><td align="right">13 </td><td><a href="input-and-output.html" class="tocviewlink" data-pltdoc="x">Input and Output</a></td></tr><tr><td align="right">14 </td><td><a href="security.html" class="tocviewlink" data-pltdoc="x">Reflection and Security</a></td></tr><tr><td align="right">15 </td><td><a href="os.html" class="tocviewlink" data-pltdoc="x">Operating System</a></td></tr><tr><td align="right">16 </td><td><a href="memory.html" class="tocviewlink" data-pltdoc="x">Memory Management</a></td></tr><tr><td align="right">17 </td><td><a href="unsafe.html" class="tocviewlink" data-pltdoc="x">Unsafe Operations</a></td></
|
||
|
interface <span class="RktPn">(</span><span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class-~3einterface%29%29" class="RktValLink" data-pltdoc="x">class->interface</a></span><span class="stt"> </span><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._object~25%29%29" class="RktValLink" data-pltdoc="x">object%</a></span><span class="RktPn">)</span>, and is transparent
|
||
|
(i.e,. its inspector is <span class="RktVal">#f</span>, so all immediate instances are
|
||
|
<span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span>). All other classes are derived from <span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._object~25%29%29" class="RktValLink" data-pltdoc="x">object%</a></span>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><table cellspacing="0" cellpadding="0" class="RktBlk RForeground"><tr><td><span class="RktPn">(</span><a name="(form._((lib._racket/private/class-internal..rkt)._class*))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">class*</a></span></span><span class="hspace"> </span><span class="RktVar">superclass-expr</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktVar">interface-expr</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">class-clause</span></td></tr><tr><td><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="stt"> </span></td></tr><tr><td><table cellspacing="0" cellpadding="0" class="specgrammar"><tr><td align="right" valign="baseline"><span class="RktVar">class-clause</span></td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="center" valign="baseline">=</td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inspect%29%29" class="RktStxLink" data-pltdoc="x">inspect</a></span><span class="hspace"> </span><span class="RktVar">inspector-expr</span><span class="RktPn">)</span></td></tr><tr><td align="right" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init%29%29" class="RktStxLink" data-pltdoc="x">init</a></span><span class="hspace"> </span><span class="RktVar">init-decl</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr><tr><td align="right" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-field%29%29" class="RktStxLink" data-pltdoc="x">init-field</a></span><span class="hspace"> </span><span class="RktVar">init-decl</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></td></tr><tr><td align="right" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="center" valign="baseline">|</td><td align="left" valign="baseline"><span class="stt"> </span></td><td align="left" valign="baseline"><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span> expression is evaluated. The result must be a class
|
||
|
value (possibly <span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._object~25%29%29" class="RktValLink" data-pltdoc="x">object%</a></span>), otherwise the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised. The result of the
|
||
|
<span class="RktVar">superclass-expr</span> expression is the new class’s superclass.</p><p>The <span class="RktVar">interface-expr</span> expressions are also evaluated when the
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span> expression is evaluated, after
|
||
|
<span class="RktVar">superclass-expr</span> is evaluated. The result of each
|
||
|
<span class="RktVar">interface-expr</span> must be an interface value, otherwise the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised. The interfaces returned by the
|
||
|
<span class="RktVar">interface-expr</span>s are all implemented by the class. For each
|
||
|
identifier in each interface, the class (or one of its ancestors) must
|
||
|
declare a public method with the same name, otherwise the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised. The class’s superclass must satisfy the
|
||
|
implementation requirement of each interface, otherwise the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised.</p><p>An <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inspect%29%29" class="RktStxLink" data-pltdoc="x">inspect</a></span> <span class="RktVar">class-clause</span> selects an inspector (see
|
||
|
<a href="inspectors.html" data-pltdoc="x">Structure Inspectors</a>) for the class extension. The
|
||
|
<span class="RktVar">inspector-expr</span> must evaluate to an inspector or <span class="RktVal">#f</span>
|
||
|
when the <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span> form is evaluated. Just as for structure
|
||
|
types, an inspector controls access to the class’s fields, including
|
||
|
private fields, and also affects comparisons using <span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span>. If
|
||
|
no <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inspect%29%29" class="RktStxLink" data-pltdoc="x">inspect</a></span> clause is provided, access to the class is
|
||
|
controlled by the parent of the current inspector (see
|
||
|
<a href="inspectors.html" data-pltdoc="x">Structure Inspectors</a>). A syntax error is reported if more than one
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inspect%29%29" class="RktStxLink" data-pltdoc="x">inspect</a></span> clause is specified.</p><p>The other <span class="RktVar">class-clause</span>s define initialization arguments,
|
||
|
public and private fields, and public and private methods. For each
|
||
|
<span class="RktVar">id</span> or <span class="RktVar">maybe-renamed</span> in a <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public%29%29" class="RktStxLink" data-pltdoc="x">public</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override%29%29" class="RktStxLink" data-pltdoc="x">override</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment%29%29" class="RktStxLink" data-pltdoc="x">augment</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._pubment%29%29" class="RktStxLink" data-pltdoc="x">pubment</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augride%29%29" class="RktStxLink" data-pltdoc="x">augride</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public-final%29%29" class="RktStxLink" data-pltdoc="x">public-final</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override-final%29%29" class="RktStxLink" data-pltdoc="x">override-final</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment-final%29%29" class="RktStxLink" data-pltdoc="x">augment-final</a></span>, or <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._private%29%29" class="RktStxLink" data-pltdoc="x">private</a></span>
|
||
|
clause, there must be one <span class="RktVar">method-definition</span>. All other
|
||
|
definition <span class="RktVar">class-clause</span>s create private fields. All remaining
|
||
|
<span class="RktVar">expr</span>s are initialization expressions to be evaluated when the
|
||
|
class is instantiated (see <a href="objcreation.html" data-pltdoc="x">Creating Objects</a>).</p><p>The result of a <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span> expression is a new class, derived
|
||
|
from the specified superclass and implementing the specified
|
||
|
interfaces. Instances of the class are created with the
|
||
|
<span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._instantiate%29%29" class="RktStxLink" data-pltdoc="x">instantiate</a></span> form or <span class="RktSym"><a href="objcreation.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._make-object%29%29" class="RktValLink" data-pltdoc="x">make-object</a></span> procedure, as
|
||
|
described in <a href="objcreation.html" data-pltdoc="x">Creating Objects</a>.</p><p>Each <span class="RktVar">class-clause</span> is (partially) macro-expanded to reveal its
|
||
|
shapes. If a <span class="RktVar">class-clause</span> is a <span class="RktSym"><a href="begin.html#%28form._%28%28quote._~23~25kernel%29._begin%29%29" class="RktStxLink" data-pltdoc="x">begin</a></span> expression, its
|
||
|
sub-expressions are lifted out of the <span class="RktSym"><a href="begin.html#%28form._%28%28quote._~23~25kernel%29._begin%29%29" class="RktStxLink" data-pltdoc="x">begin</a></span> and treated as
|
||
|
<span class="RktVar">class-clause</span>s, in the same way that <span class="RktSym"><a href="begin.html#%28form._%28%28quote._~23~25kernel%29._begin%29%29" class="RktStxLink" data-pltdoc="x">begin</a></span> is
|
||
|
flattened for top-level and embedded definitions.</p><p>Within a <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span> form for instances of the new class,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._this%29%29" class="RktStxLink" data-pltdoc="x">this</a></span> is bound to the object itself;
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._this~25%29%29" class="RktStxLink" data-pltdoc="x">this%</a></span> is bound to the class of the object;
|
||
|
<span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super-instantiate%29%29" class="RktStxLink" data-pltdoc="x">super-instantiate</a></span>, <span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super-make-object%29%29" class="RktStxLink" data-pltdoc="x">super-make-object</a></span>, and
|
||
|
<span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super-new%29%29" class="RktStxLink" data-pltdoc="x">super-new</a></span> are bound to forms to initialize fields in the
|
||
|
superclass (see <a href="objcreation.html" data-pltdoc="x">Creating Objects</a>); <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super%29%29" class="RktStxLink" data-pltdoc="x">super</a></span> is
|
||
|
available for calling superclass methods (see
|
||
|
<a href="createclass.html#%28part._clmethoddefs%29" data-pltdoc="x">Method Definitions</a>); and <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inner%29%29" class="RktStxLink" data-pltdoc="x">inner</a></span> is available for
|
||
|
calling subclass augmentations of methods (see
|
||
|
<a href="createclass.html#%28part._clmethoddefs%29" data-pltdoc="x">Method Definitions</a>).</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/private/class-internal..rkt)._class))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">class</a></span></span><span class="hspace"> </span><span class="RktVar">superclass-expr</span><span class="hspace"> </span><span class="RktVar">class-clause</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Like <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span>, but omits the <span class="RktVar">interface-expr</span>s, for the case that none are needed.</div></p><p><div class="SIntrapara">Example:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">book-class%</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span><span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._object~25%29%29" class="RktValLink" data-pltdoc="x">object%</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._field%29%29" class="RktStxLink" data-pltdoc="x">field</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">pages</span><span class="hspace"> </span><span class="RktVal">5</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define%2Fpublic%29%29" class="RktStxLink" data-pltdoc="x">define/public</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">letters</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._%2A%29%29" class="RktValLink" data-pltdoc="x">*</a></span><span class="hspace"> </span><span class="RktSym">pages</span><span class="hspace"> </span><span class="RktVal">500</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super-new%29%29" class="RktStxLink" data-pltdoc="x">super-new</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><b
|
||
|
to the current object (i.e., the object being initialized or whose
|
||
|
method was called). Use outside the body of a <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span> form is
|
||
|
a syntax error.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">describe</span><span class="hspace"> </span><span class="RktSym">obj</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="Writing.html#%28def._%28%28quote._~23~25kernel%29._printf%29%29" class="RktValLink" data-pltdoc="x">printf</a></span><span class="hspace"> </span><span class="RktVal">"Hello ~a\n"</span><span class="hspace"> </span><span class="RktSym">obj</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">table%</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span><span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._object~25%29%29" class="RktValLink" data-pltdoc="x">object%</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define%2Fpublic%29%29" class="RktStxLink" data-pltdoc="x">define/public</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">describe-self</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">describe</span><span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._this%29%29" class="RktStxLink" data-pltdoc="x">this</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super-new%29%29" class="RktStxLink" data-pltdoc="x">super-new</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p> </p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="ivaraccess.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._send%29%29" class="RktStxLink" data-pltdoc="x">send</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._new%29%29" class="RktStxLink" data-pltdoc="x">new</a></span><span class="hspace"> </span><span class="RktSym">table%</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">describe-self</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktOut">Hello #(struct:object:table% ...)</span></p></td></tr></table></blockquote></div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></di
|
||
|
of the current object (i.e., the object being initialized or whose
|
||
|
method was called). Use outside the body of a <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span> form is
|
||
|
a syntax error.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">account%</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span><span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._object~25%29%29" class="RktValLink" data-pltdoc="x">object%</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super-new%29%29" class="RktStxLink" data-pltdoc="x">super-new</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-field%29%29" class="RktStxLink" data-pltdoc="x">init-field</a></span><span class="hspace"> </span><span class="RktSym">balance</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define%2Fpublic%29%29" class="RktStxLink" data-pltdoc="x">define/public</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">add</span><span class="hspace"> </span><span class="RktSym">n</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._new%29%29" class="RktStxLink" data-pltdoc="x">new</a></span><span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._this~25%29%29" class="RktStxLink" data-pltdoc="x">this%</a></span><span class="hspace"> </span><span class="RktPn">[</span><span class="RktSym">balance</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._%2B%29%29" class="RktValLink" data-pltdoc="x">+</a></span><span class="hspace"> </span><span class="RktSym">n</span><span class="hspace"> </span><span class="RktSym">balance</span><span class="RktPn">)</span><span class="RktPn">]</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">savings%</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span><span class="hspace"> </span><span class="RktSym">account%</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super-new%29%29" class="RktStxLink" data-pltdo
|
||
|
source for all syntax errors within the class definition. For example,
|
||
|
<span class="RktSym"><a href="objectserialize.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-serializable-class%29%29" class="RktStxLink" data-pltdoc="x">define-serializable-class</a></span> expands to <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2Fderived%29%29" class="RktStxLink" data-pltdoc="x">class/derived</a></span>
|
||
|
so that errors in the body of the class are reported in terms of
|
||
|
<span class="RktSym"><a href="objectserialize.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-serializable-class%29%29" class="RktStxLink" data-pltdoc="x">define-serializable-class</a></span> instead of <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span>.</div></p><p>The <span class="RktVar">original-datum</span> is the original expression to use for
|
||
|
reporting errors.</p><p>The <span class="RktVar">name-id</span> is used to name the resulting class; if it
|
||
|
is <span class="RktVal">#f</span>, the class name is inferred.</p><p>The <span class="RktVar">super-expr</span>, <span class="RktVar">interface-expr</span>s, and
|
||
|
<span class="RktVar">class-clause</span>s are as for <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span>.</p><p>If the <span class="RktVar">deserialize-id-expr</span> is not literally <span class="RktVal">#f</span>, then
|
||
|
a serializable class is generated, and the result is two values
|
||
|
instead of one: the class and a deserialize-info structure produced by
|
||
|
<span class="RktSym"><a href="serialization.html#%28def._%28%28lib._racket%2Fprivate%2Fserialize..rkt%29._make-deserialize-info%29%29" class="RktValLink" data-pltdoc="x">make-deserialize-info</a></span>. The <span class="RktVar">deserialize-id-expr</span>
|
||
|
should produce a value suitable as the second argument to
|
||
|
<span class="RktSym"><a href="serialization.html#%28def._%28%28lib._racket%2Fprivate%2Fserialize..rkt%29._make-serialize-info%29%29" class="RktValLink" data-pltdoc="x">make-serialize-info</a></span>, and it should refer to an export whose
|
||
|
value is the deserialize-info structure.</p><p>Future optional forms may be added to the sequence that currently ends
|
||
|
with <span class="RktVar">deserialize-id-expr</span>.</p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""clinitvars"">6.2.1<tt> </tt><a name="(part._clinitvars)"></a>Initialization Variables</h5><p>A class’s initialization variables, declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init%29%29" class="RktStxLink" data-pltdoc="x">init</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-field%29%29" class="RktStxLink" data-pltdoc="x">init-field</a></span>, and <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-rest%29%29" class="RktStxLink" data-pltdoc="x">init-rest</a></span>, are instantiated
|
||
|
for each object of a class. Initialization variables can be used in
|
||
|
the initial value expressions of fields, default value expressions
|
||
|
for initialization arguments, and in initialization expressions. Only
|
||
|
initialization variables declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-field%29%29" class="RktStxLink" data-pltdoc="x">init-field</a></span> can be
|
||
|
accessed from methods; accessing any other initialization variable
|
||
|
from a method is a syntax error.</p><p>The values bound to initialization variables are</p><ul><li><p>the arguments provided with <span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._instantiate%29%29" class="RktStxLink" data-pltdoc="x">instantiate</a></span> or passed to
|
||
|
<span class="RktSym"><a href="objcreation.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._make-object%29%29" class="RktValLink" data-pltdoc="x">make-object</a></span>, if the object is created as a direct instance
|
||
|
of the class; or,</p></li><li><p>the arguments passed to the superclass initialization form or
|
||
|
procedure, if the object is created as an instance of a derived
|
||
|
class.</p></li></ul><p>If an initialization argument is not provided for an initialization
|
||
|
variable that has an associated <span class="RktVar">default-value-expr</span>, then the
|
||
|
<span class="RktVar">default-value-expr</span> expression is evaluated to obtain a value
|
||
|
for the variable. A <span class="RktVar">default-value-expr</span> is only evaluated when
|
||
|
an argument is not provided for its variable. The environment of
|
||
|
<span class="RktVar">default-value-expr</span> includes all of the initialization
|
||
|
variables, all of the fields, and all of the methods of the class. If
|
||
|
multiple <span class="RktVar">default-value-expr</span>s are evaluated, they are
|
||
|
evaluated from left to right. Object creation and field initialization
|
||
|
are described in detail in <a href="objcreation.html" data-pltdoc="x">Creating Objects</a>.</p><p>If an initialization variable has no <span class="RktVar">default-value-expr</span>, then
|
||
|
the object creation or superclass initialization call must supply an
|
||
|
argument for the variable, otherwise the <span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised.</p><p>Initialization arguments can be provided by name or by position. The
|
||
|
external name of an initialization variable can be used with
|
||
|
<span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._instantiate%29%29" class="RktStxLink" data-pltdoc="x">instantiate</a></span> or with the superclass initialization form. Those
|
||
|
forms also accept by-position arguments. The <span class="RktSym"><a href="objcreation.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._make-object%29%29" class="RktValLink" data-pltdoc="x">make-object</a></span>
|
||
|
procedure and the superclass initialization procedure accept only
|
||
|
by-position arguments.</p><p>Arguments provided by position are converted into by-name arguments
|
||
|
using the order of <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init%29%29" class="RktStxLink" data-pltdoc="x">init</a></span> and <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-field%29%29" class="RktStxLink" data-pltdoc="x">init-field</a></span> clauses and
|
||
|
the order of variables within each clause. When an <span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._instantiate%29%29" class="RktStxLink" data-pltdoc="x">instantiate</a></span>
|
||
|
form provides both by-position and by-name arguments, the converted
|
||
|
arguments are placed before by-name arguments. (The order can be
|
||
|
significant; see also <a href="objcreation.html" data-pltdoc="x">Creating Objects</a>.)</p><p>Unless a class contains an <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-rest%29%29" class="RktStxLink" data-pltdoc="x">init-rest</a></span> clause, when the number
|
||
|
of by-position arguments exceeds the number of declared initialization
|
||
|
variables, the order of variables in the superclass (and so on, up the
|
||
|
superclass chain) determines the by-name conversion.</p><p>If a class expression contains an <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-rest%29%29" class="RktStxLink" data-pltdoc="x">init-rest</a></span> clause, there
|
||
|
must be only one, and it must be last. If it declares a variable, then
|
||
|
the variable receives extra by-position initialization arguments as a
|
||
|
list (similar to a dotted “rest argument” in a procedure). An
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-rest%29%29" class="RktStxLink" data-pltdoc="x">init-rest</a></span> variable can receive by-position initialization
|
||
|
arguments that are left over from a by-name conversion for a derived
|
||
|
class. When a derived class’s superclass initialization provides even
|
||
|
more by-position arguments, they are prefixed onto the by-position
|
||
|
arguments accumulated so far.</p><p>If too few or too many by-position initialization arguments are
|
||
|
provided to an object creation or superclass initialization, then the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised. Similarly, if extra by-position arguments
|
||
|
are provided to a class with an <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-rest%29%29" class="RktStxLink" data-pltdoc="x">init-rest</a></span> clause, the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised.</p><p>Unused (by-name) arguments are to be propagated to the superclass, as
|
||
|
described in <a href="objcreation.html" data-pltdoc="x">Creating Objects</a>. Multiple initialization
|
||
|
arguments can use the same name if the class derivation contains
|
||
|
multiple declarations (in different classes) of initialization
|
||
|
variables with the name. See <a href="objcreation.html" data-pltdoc="x">Creating Objects</a> for further
|
||
|
details.</p><p>See also <a href="createclass.html#%28part._extnames%29" data-pltdoc="x">Internal and External Names</a> for information about internal and
|
||
|
external names.</p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""clfields"">6.2.2<tt> </tt><a name="(part._clfields)"></a>Fields</h5><p>Each <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._field%29%29" class="RktStxLink" data-pltdoc="x">field</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-field%29%29" class="RktStxLink" data-pltdoc="x">init-field</a></span>, and non-method
|
||
|
<span class="RktSym"><a href="define.html#%28form._%28%28quote._~23~25kernel%29._define-values%29%29" class="RktStxLink" data-pltdoc="x">define-values</a></span> clause in a class declares one or more new
|
||
|
fields for the class. Fields declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._field%29%29" class="RktStxLink" data-pltdoc="x">field</a></span> or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-field%29%29" class="RktStxLink" data-pltdoc="x">init-field</a></span> are public. Public fields can be accessed and
|
||
|
mutated by subclasses using <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit-field%29%29" class="RktStxLink" data-pltdoc="x">inherit-field</a></span>. Public fields are
|
||
|
also accessible outside the class via <span class="RktSym"><a href="ivaraccess.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class-field-accessor%29%29" class="RktStxLink" data-pltdoc="x">class-field-accessor</a></span>
|
||
|
and mutable via <span class="RktSym"><a href="ivaraccess.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class-field-mutator%29%29" class="RktStxLink" data-pltdoc="x">class-field-mutator</a></span> (see
|
||
|
<a href="ivaraccess.html" data-pltdoc="x">Field and Method Access</a>). Fields declared with <span class="RktSym"><a href="define.html#%28form._%28%28quote._~23~25kernel%29._define-values%29%29" class="RktStxLink" data-pltdoc="x">define-values</a></span>
|
||
|
are accessible only within the class.</p><p>A field declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-field%29%29" class="RktStxLink" data-pltdoc="x">init-field</a></span> is both a public field and
|
||
|
an initialization variable. See <a href="createclass.html#%28part._clinitvars%29" data-pltdoc="x">Initialization Variables</a> for
|
||
|
information about initialization variables.</p><p>An <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit-field%29%29" class="RktStxLink" data-pltdoc="x">inherit-field</a></span> declaration makes a public field defined by
|
||
|
a superclass directly accessible in the class expression. If the
|
||
|
indicated field is not defined in the superclass, the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised when the class expression is evaluated.
|
||
|
Every field in a superclass is present in a derived class, even if it
|
||
|
is not declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit-field%29%29" class="RktStxLink" data-pltdoc="x">inherit-field</a></span> in the derived class. The
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit-field%29%29" class="RktStxLink" data-pltdoc="x">inherit-field</a></span> clause does not control inheritance, but merely
|
||
|
controls lexical scope within a class expression.</p><p>When an object is first created, all of its fields have the
|
||
|
<a href="https://download.racket-lang.org/releases/8.6/doc/local-redirect/index.html?doc=guide&rel=void_undefined.html&version=8.6" class="RktModLink Sq" data-pltdoc="x"><span class="nobreak"><span class="RktRes">#<undefined></span></span></a> value (see <a href="void.html" data-pltdoc="x">Void</a>). The fields of a
|
||
|
class are initialized at the same time that the class’s initialization
|
||
|
expressions are evaluated; see <a href="objcreation.html" data-pltdoc="x">Creating Objects</a> for more
|
||
|
information.</p><p>See also <a href="createclass.html#%28part._extnames%29" data-pltdoc="x">Internal and External Names</a> for information about internal and
|
||
|
external names.</p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""clmethods"">6.2.3<tt> </tt><a name="(part._clmethods)"></a>Methods</h5><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""clmethoddefs"">6.2.3.1<tt> </tt><a name="(part._clmethoddefs)"></a>Method Definitions</h5><p>Each <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public%29%29" class="RktStxLink" data-pltdoc="x">public</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override%29%29" class="RktStxLink" data-pltdoc="x">override</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment%29%29" class="RktStxLink" data-pltdoc="x">augment</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._pubment%29%29" class="RktStxLink" data-pltdoc="x">pubment</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augride%29%29" class="RktStxLink" data-pltdoc="x">augride</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public-final%29%29" class="RktStxLink" data-pltdoc="x">public-final</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override-final%29%29" class="RktStxLink" data-pltdoc="x">override-final</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment-final%29%29" class="RktStxLink" data-pltdoc="x">augment-final</a></span>, and <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._private%29%29" class="RktStxLink" data-pltdoc="x">private</a></span>
|
||
|
clause in a class declares one or more method names. Each method name
|
||
|
must have a corresponding <span class="RktVar">method-definition</span>. The order of
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public%29%29" class="RktStxLink" data-pltdoc="x">public</a></span>, etc<span class="Sendabbrev">.</span>, clauses and their corresponding definitions
|
||
|
(among themselves, and with respect to other clauses in the class)
|
||
|
does not matter.</p><p>As shown in the grammar for <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span>, a method definition is
|
||
|
syntactically restricted to certain procedure forms, as defined by the
|
||
|
grammar for <span class="RktVar">method-procedure</span>; in the last two forms of
|
||
|
<span class="RktVar">method-procedure</span>, the body <span class="RktSym">id</span> must be one of the
|
||
|
<span class="RktSym">id</span>s bound by <span class="RktSym"><a href="let.html#%28form._%28%28quote._~23~25kernel%29._let-values%29%29" class="RktStxLink" data-pltdoc="x">let-values</a></span> or <span class="RktSym"><a href="let.html#%28form._%28%28quote._~23~25kernel%29._letrec-values%29%29" class="RktStxLink" data-pltdoc="x">letrec-values</a></span>. A
|
||
|
<span class="RktVar">method-procedure</span> expression is not evaluated
|
||
|
directly. Instead, for each method, a class-specific method procedure
|
||
|
is created; it takes an initial object argument, in addition to the
|
||
|
arguments the procedure would accept if the <span class="RktVar">method-procedure</span>
|
||
|
expression were evaluated directly. The body of the procedure is
|
||
|
transformed to access methods and fields through the object argument.</p><p>A method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public%29%29" class="RktStxLink" data-pltdoc="x">public</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._pubment%29%29" class="RktStxLink" data-pltdoc="x">pubment</a></span>, or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public-final%29%29" class="RktStxLink" data-pltdoc="x">public-final</a></span> introduces a new method into a class. The method
|
||
|
must not be present already in the superclass, otherwise the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised when the class expression is evaluated. A
|
||
|
method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public%29%29" class="RktStxLink" data-pltdoc="x">public</a></span> can be overridden in a subclass
|
||
|
that uses <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override%29%29" class="RktStxLink" data-pltdoc="x">override</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span>, or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override-final%29%29" class="RktStxLink" data-pltdoc="x">override-final</a></span>. A method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._pubment%29%29" class="RktStxLink" data-pltdoc="x">pubment</a></span> can
|
||
|
be augmented in a subclass that uses <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment%29%29" class="RktStxLink" data-pltdoc="x">augment</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augride%29%29" class="RktStxLink" data-pltdoc="x">augride</a></span>, or <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment-final%29%29" class="RktStxLink" data-pltdoc="x">augment-final</a></span>. A method declared with
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public-final%29%29" class="RktStxLink" data-pltdoc="x">public-final</a></span> cannot be overridden or augmented in a subclass.</p><p>A method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override%29%29" class="RktStxLink" data-pltdoc="x">override</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span>, or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override-final%29%29" class="RktStxLink" data-pltdoc="x">override-final</a></span> overrides a definition already present in the
|
||
|
superclass. If the method is not already present, the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised when the class expression is evaluated. A
|
||
|
method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override%29%29" class="RktStxLink" data-pltdoc="x">override</a></span> can be overridden again in a
|
||
|
subclass that uses <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override%29%29" class="RktStxLink" data-pltdoc="x">override</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span>, or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override-final%29%29" class="RktStxLink" data-pltdoc="x">override-final</a></span>. A method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span> can
|
||
|
be augmented in a subclass that uses <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment%29%29" class="RktStxLink" data-pltdoc="x">augment</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augride%29%29" class="RktStxLink" data-pltdoc="x">augride</a></span>, or <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment-final%29%29" class="RktStxLink" data-pltdoc="x">augment-final</a></span>. A method declared with
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override-final%29%29" class="RktStxLink" data-pltdoc="x">override-final</a></span> cannot be overridden further or augmented in a
|
||
|
subclass.</p><p>A method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment%29%29" class="RktStxLink" data-pltdoc="x">augment</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augride%29%29" class="RktStxLink" data-pltdoc="x">augride</a></span>, or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment-final%29%29" class="RktStxLink" data-pltdoc="x">augment-final</a></span> augments a definition already present in the
|
||
|
superclass. If the method is not already present, the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised when the class expression is evaluated. A
|
||
|
method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment%29%29" class="RktStxLink" data-pltdoc="x">augment</a></span> can be augmented further in a
|
||
|
subclass that uses <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment%29%29" class="RktStxLink" data-pltdoc="x">augment</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augride%29%29" class="RktStxLink" data-pltdoc="x">augride</a></span>, or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment-final%29%29" class="RktStxLink" data-pltdoc="x">augment-final</a></span>. A method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augride%29%29" class="RktStxLink" data-pltdoc="x">augride</a></span> can be
|
||
|
overridden in a subclass that uses <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override%29%29" class="RktStxLink" data-pltdoc="x">override</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span>, or <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override-final%29%29" class="RktStxLink" data-pltdoc="x">override-final</a></span>. (Such an override
|
||
|
merely replaces the augmentation, not the method that is augmented.)
|
||
|
A method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment-final%29%29" class="RktStxLink" data-pltdoc="x">augment-final</a></span> cannot be overridden or
|
||
|
augmented further in a subclass.</p><p>A method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._private%29%29" class="RktStxLink" data-pltdoc="x">private</a></span> is not accessible outside the
|
||
|
class expression, cannot be overridden, and never overrides a method
|
||
|
in the superclass.</p><p>When a method is declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override%29%29" class="RktStxLink" data-pltdoc="x">override</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span>,
|
||
|
or <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override-final%29%29" class="RktStxLink" data-pltdoc="x">override-final</a></span>, then the superclass implementation of the
|
||
|
method can be called using <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super%29%29" class="RktStxLink" data-pltdoc="x">super</a></span> form.</p><p>When a method is declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._pubment%29%29" class="RktStxLink" data-pltdoc="x">pubment</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment%29%29" class="RktStxLink" data-pltdoc="x">augment</a></span>, or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span>, then a subclass augmenting method can be called
|
||
|
using the <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inner%29%29" class="RktStxLink" data-pltdoc="x">inner</a></span> form. The only difference between
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public-final%29%29" class="RktStxLink" data-pltdoc="x">public-final</a></span> and <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._pubment%29%29" class="RktStxLink" data-pltdoc="x">pubment</a></span> without a corresponding
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inner%29%29" class="RktStxLink" data-pltdoc="x">inner</a></span> is that <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public-final%29%29" class="RktStxLink" data-pltdoc="x">public-final</a></span> prevents the declaration
|
||
|
of augmenting methods that would be ignored.</p><p>A method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._abstract%29%29" class="RktStxLink" data-pltdoc="x">abstract</a></span> must be declared without
|
||
|
an implementation. Subclasses may implement abstract methods via the
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override%29%29" class="RktStxLink" data-pltdoc="x">override</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span>, or <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override-final%29%29" class="RktStxLink" data-pltdoc="x">override-final</a></span>
|
||
|
forms. Any class that contains or inherits any abstract methods is
|
||
|
considered abstract and cannot be instantiated.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/private/class-internal..rkt)._super))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">super</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">arg</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">super</a></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">arg</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="hspace"> </span><span class="RktPn">. </span><span class="RktVar">arg-list-expr</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">Always accesses the superclass method, independent of whether the
|
||
|
method is overridden again in subclasses. Using the <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super%29%29" class="RktStxLink" data-pltdoc="x">super</a></span>
|
||
|
form outside of <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span> is a syntax error. Each <span class="RktVar">arg</span>
|
||
|
is as for <span class="RktSym"><a href="application.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._~23~25app%29%29" class="RktStxLink" data-pltdoc="x">#%app</a></span>: either <span class="RktVar">arg-expr</span> or
|
||
|
<span class="RktVar">keyword</span><span class="stt"> </span><span class="RktVar">arg-expr</span>.</div></p><p>The second form is analogous to using <span class="RktSym"><a href="procedures.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._apply%29%29" class="RktValLink" data-pltdoc="x">apply</a></span> with a procedure;
|
||
|
the <span class="RktVar">arg-list-expr</span> must not be a parenthesized expression.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/private/class-internal..rkt)._inner))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inner%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">inner</a></span></span><span class="hspace"> </span><span class="RktVar">default-expr</span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">arg</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inner%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">inner</a></span><span class="hspace"> </span><span class="RktVar">default-expr</span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktVar">arg</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="hspace"> </span><span class="RktPn">. </span><span class="RktVar">arg-list-expr</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">If the object’s class does not supply an augmenting method, then
|
||
|
<span class="RktVar">default-expr</span> is evaluated, and the <span class="RktVar">arg</span> expressions
|
||
|
are not evaluated. Otherwise, the augmenting method is called with the
|
||
|
<span class="RktVar">arg</span> results as arguments, and <span class="RktVar">default-expr</span> is not
|
||
|
evaluated. If no <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inner%29%29" class="RktStxLink" data-pltdoc="x">inner</a></span> call is evaluated for a particular
|
||
|
method, then augmenting methods supplied by subclasses are never
|
||
|
used. Using the <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inner%29%29" class="RktStxLink" data-pltdoc="x">inner</a></span> form outside of <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%2A%29%29" class="RktStxLink" data-pltdoc="x">class*</a></span> is an
|
||
|
syntax error.</div></p><p>The second form is analogous to using <span class="RktSym"><a href="procedures.html#%28def._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._apply%29%29" class="RktValLink" data-pltdoc="x">apply</a></span> with a procedure;
|
||
|
the <span class="RktVar">arg-list-expr</span> must not be a parenthesized expression.</p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""classinherit"">6.2.3.2<tt> </tt><a name="(part._classinherit)"></a>Inherited and Superclass Methods</h5><p>Each <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%29%29" class="RktStxLink" data-pltdoc="x">inherit</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Fsuper%29%29" class="RktStxLink" data-pltdoc="x">inherit/super</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Finner%29%29" class="RktStxLink" data-pltdoc="x">inherit/inner</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-super%29%29" class="RktStxLink" data-pltdoc="x">rename-super</a></span>, and <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-inner%29%29" class="RktStxLink" data-pltdoc="x">rename-inner</a></span> clause declares one
|
||
|
or more methods that are defined in the class, but must be present in
|
||
|
the superclass. The <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-super%29%29" class="RktStxLink" data-pltdoc="x">rename-super</a></span> and <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-inner%29%29" class="RktStxLink" data-pltdoc="x">rename-inner</a></span>
|
||
|
declarations are rarely used, since <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Fsuper%29%29" class="RktStxLink" data-pltdoc="x">inherit/super</a></span> and
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Finner%29%29" class="RktStxLink" data-pltdoc="x">inherit/inner</a></span> provide the same access. Also, superclass and
|
||
|
augmenting methods are typically accessed through <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super%29%29" class="RktStxLink" data-pltdoc="x">super</a></span> and
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inner%29%29" class="RktStxLink" data-pltdoc="x">inner</a></span> in a class that also declares the methods, instead of
|
||
|
through <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Fsuper%29%29" class="RktStxLink" data-pltdoc="x">inherit/super</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Finner%29%29" class="RktStxLink" data-pltdoc="x">inherit/inner</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-super%29%29" class="RktStxLink" data-pltdoc="x">rename-super</a></span>, or <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-inner%29%29" class="RktStxLink" data-pltdoc="x">rename-inner</a></span>.</p><p>Method names declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%29%29" class="RktStxLink" data-pltdoc="x">inherit</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Fsuper%29%29" class="RktStxLink" data-pltdoc="x">inherit/super</a></span>,
|
||
|
or <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Finner%29%29" class="RktStxLink" data-pltdoc="x">inherit/inner</a></span> access overriding declarations, if any, at
|
||
|
run time. Method names declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Fsuper%29%29" class="RktStxLink" data-pltdoc="x">inherit/super</a></span> can also
|
||
|
be used with the <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super%29%29" class="RktStxLink" data-pltdoc="x">super</a></span> form to access the superclass
|
||
|
implementation, and method names declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Finner%29%29" class="RktStxLink" data-pltdoc="x">inherit/inner</a></span>
|
||
|
can also be used with the <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inner%29%29" class="RktStxLink" data-pltdoc="x">inner</a></span> form to access an augmenting
|
||
|
method, if any.</p><p>Method names declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-super%29%29" class="RktStxLink" data-pltdoc="x">rename-super</a></span> always access the
|
||
|
superclass’s implementation at run-time. Methods declared with
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-inner%29%29" class="RktStxLink" data-pltdoc="x">rename-inner</a></span> access a subclass’s augmenting method, if any,
|
||
|
and must be called with the form</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVar">default-expr</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVar">arg</span><span class="hspace"> </span><span class="RktSym"><a href="stx-patterns.html#%28form._%28%28lib._racket%2Fprivate%2Fstxcase-scheme..rkt%29._......%29%29" class="RktStxLink" data-pltdoc="x">...</a></span><span class="RktPn">)</span></p></blockquote><p>so that a <span class="RktSym">default-expr</span> is available to evaluate when no
|
||
|
augmenting method is available. In such a form, <span class="RktSym"><a href="lambda.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._lambda%29%29" class="RktStxLink" data-pltdoc="x">lambda</a></span> is a
|
||
|
literal identifier to separate the <span class="RktSym">default-expr</span> from the
|
||
|
<span class="RktSym">arg</span>. When an augmenting method is available, it receives the
|
||
|
results of the <span class="RktSym">arg</span> expressions as arguments.</p><p>Methods that are present in the superclass but not declared with
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%29%29" class="RktStxLink" data-pltdoc="x">inherit</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Fsuper%29%29" class="RktStxLink" data-pltdoc="x">inherit/super</a></span>, or <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Finner%29%29" class="RktStxLink" data-pltdoc="x">inherit/inner</a></span> or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-super%29%29" class="RktStxLink" data-pltdoc="x">rename-super</a></span> are not directly accessible in the class
|
||
|
(though they can be called with <span class="RktSym"><a href="ivaraccess.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._send%29%29" class="RktStxLink" data-pltdoc="x">send</a></span>). Every public method
|
||
|
in a superclass is present in a derived class, even if it is not
|
||
|
declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%29%29" class="RktStxLink" data-pltdoc="x">inherit</a></span> in the derived class; the
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%29%29" class="RktStxLink" data-pltdoc="x">inherit</a></span> clause does not control inheritance, but merely
|
||
|
controls lexical scope within a class expression.</p><p>If a method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%29%29" class="RktStxLink" data-pltdoc="x">inherit</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Fsuper%29%29" class="RktStxLink" data-pltdoc="x">inherit/super</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Finner%29%29" class="RktStxLink" data-pltdoc="x">inherit/inner</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-super%29%29" class="RktStxLink" data-pltdoc="x">rename-super</a></span>, or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-inner%29%29" class="RktStxLink" data-pltdoc="x">rename-inner</a></span> is not present in the superclass, the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised when the class expression is evaluated.</p><h5 x-source-module="(lib "scribblings/reference/reference.scrbl")" x-source-pkg="racket-doc" x-part-tag=""extnames"">6.2.3.3<tt> </tt><a name="(part._extnames)"></a>Internal and External Names</h5><p>Each method declared with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public%29%29" class="RktStxLink" data-pltdoc="x">public</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override%29%29" class="RktStxLink" data-pltdoc="x">override</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment%29%29" class="RktStxLink" data-pltdoc="x">augment</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._pubment%29%29" class="RktStxLink" data-pltdoc="x">pubment</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._overment%29%29" class="RktStxLink" data-pltdoc="x">overment</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augride%29%29" class="RktStxLink" data-pltdoc="x">augride</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._public-final%29%29" class="RktStxLink" data-pltdoc="x">public-final</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._override-final%29%29" class="RktStxLink" data-pltdoc="x">override-final</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._augment-final%29%29" class="RktStxLink" data-pltdoc="x">augment-final</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%29%29" class="RktStxLink" data-pltdoc="x">inherit</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Fsuper%29%29" class="RktStxLink" data-pltdoc="x">inherit/super</a></span>,
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit%2Finner%29%29" class="RktStxLink" data-pltdoc="x">inherit/inner</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-super%29%29" class="RktStxLink" data-pltdoc="x">rename-super</a></span>, and
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-inner%29%29" class="RktStxLink" data-pltdoc="x">rename-inner</a></span> can have separate internal and external names
|
||
|
when <span class="RktPn">(</span><span class="RktSym">internal-id</span><span class="stt"> </span><span class="RktSym">external-id</span><span class="RktPn">)</span> is used for declaring the
|
||
|
method. The internal name is used to access the method directly within
|
||
|
the class expression (including within <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super%29%29" class="RktStxLink" data-pltdoc="x">super</a></span> or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inner%29%29" class="RktStxLink" data-pltdoc="x">inner</a></span> forms), while the external name is used with
|
||
|
<span class="RktSym"><a href="ivaraccess.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._send%29%29" class="RktStxLink" data-pltdoc="x">send</a></span> and <span class="RktSym"><a href="ivaraccess.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._generic%29%29" class="RktStxLink" data-pltdoc="x">generic</a></span> (see <a href="ivaraccess.html" data-pltdoc="x">Field and Method Access</a>). If
|
||
|
a single <span class="RktSym">id</span> is provided for a method declaration, the
|
||
|
identifier is used for both the internal and external names.</p><p>Method inheritance, overriding, and augmentation are based on external
|
||
|
names only. Separate internal and external names are required for
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-super%29%29" class="RktStxLink" data-pltdoc="x">rename-super</a></span> and <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._rename-inner%29%29" class="RktStxLink" data-pltdoc="x">rename-inner</a></span> (for historical
|
||
|
reasons, mainly).</p><p>Each <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init%29%29" class="RktStxLink" data-pltdoc="x">init</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._init-field%29%29" class="RktStxLink" data-pltdoc="x">init-field</a></span>, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._field%29%29" class="RktStxLink" data-pltdoc="x">field</a></span>, or
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit-field%29%29" class="RktStxLink" data-pltdoc="x">inherit-field</a></span> variable similarly has an internal and an
|
||
|
external name. The internal name is used within the class to access
|
||
|
the variable, while the external name is used outside the class when
|
||
|
providing initialization arguments (e.g., to <span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._instantiate%29%29" class="RktStxLink" data-pltdoc="x">instantiate</a></span>),
|
||
|
inheriting a field, or accessing a field externally (e.g., with
|
||
|
<span class="RktSym"><a href="ivaraccess.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class-field-accessor%29%29" class="RktStxLink" data-pltdoc="x">class-field-accessor</a></span>). As for methods, when inheriting a
|
||
|
field with <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._inherit-field%29%29" class="RktStxLink" data-pltdoc="x">inherit-field</a></span>, the external name is matched to an
|
||
|
external field name in the superclass, while the internal name is
|
||
|
bound in the <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span> expression.</p><p>A single identifier can be used as an internal identifier and an
|
||
|
external identifier, and it is possible to use the same identifier as
|
||
|
internal and external identifiers for different bindings. Furthermore,
|
||
|
within a single class, a single name can be used as an external method
|
||
|
name, an external field name, and an external initialization argument
|
||
|
name. Overall, each internal identifier must be distinct from all
|
||
|
other internal identifiers, each external method name must be distinct
|
||
|
from all other method names, each external field name must be distinct
|
||
|
from all other field names, and each initialization argument name must
|
||
|
be distinct from all other initialization argument names.</p><p>By default, external names have no lexical scope, which means, for
|
||
|
example, that an external method name matches the same syntactic
|
||
|
symbol in all uses of <span class="RktSym"><a href="ivaraccess.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._send%29%29" class="RktStxLink" data-pltdoc="x">send</a></span>. The
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-local-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-local-member-name</a></span> and <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-member-name</a></span> forms
|
||
|
introduce scoped external names.</p><p>When a <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span> expression is compiled, identifiers used in
|
||
|
place of external names must be symbolically distinct (when the
|
||
|
corresponding external names are required to be distinct), otherwise a
|
||
|
syntax error is reported. When no external name is bound by
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-member-name</a></span>, then the actual external names are
|
||
|
guaranteed to be distinct when <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span> expression is evaluated.
|
||
|
When any external name is bound by <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-member-name</a></span>, the
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._exn~3afail~3aobject%29%29" class="RktValLink" data-pltdoc="x">exn:fail:object</a></span> exception is raised by <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span> if the actual external
|
||
|
names are not distinct.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/private/class-internal..rkt)._define-local-member-name))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-local-member-name%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">define-local-member-name</a></span></span><span class="hspace"> </span><span class="RktVar">id</span><span class="hspace"> </span><span class="RktMeta">...</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Unless it appears as the top-level definition, binds each <span class="RktVar">id</span>
|
||
|
so that, within the scope of the definition, each use of each
|
||
|
<span class="RktVar">id</span> as an external name is resolved to a hidden name generated
|
||
|
by the <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-local-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-local-member-name</a></span> declaration. Thus, methods,
|
||
|
fields, and initialization arguments declared with such external-name
|
||
|
<span class="RktVar">id</span>s are accessible only in the scope of the
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-local-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-local-member-name</a></span> declaration. As a top-level
|
||
|
definition, <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-local-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-local-member-name</a></span> binds <span class="RktVar">id</span> to its
|
||
|
symbolic form.</div></p><p>The binding introduced by <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-local-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-local-member-name</a></span> is a
|
||
|
syntax binding that can be exported and imported with
|
||
|
<span class="RktSym"><a href="module.html#%28form._%28%28quote._~23~25kernel%29._module%29%29" class="RktStxLink" data-pltdoc="x">module</a></span>s. Each evaluation of a
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-local-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-local-member-name</a></span> declaration generates a distinct
|
||
|
hidden name (except as a top-level definition). The
|
||
|
<span class="RktSym"><a href="objectutils.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._interface-~3emethod-names%29%29" class="RktValLink" data-pltdoc="x">interface->method-names</a></span> procedure does not expose hidden
|
||
|
names.</p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28quote._~23~25kernel%29._define-values%29%29" class="RktStxLink" data-pltdoc="x">define-values</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">r</span><span class="hspace"> </span><span class="RktSym">o</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="let.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._let%29%29" class="RktStxLink" data-pltdoc="x">let</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-local-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-local-member-name</a></span><span class="hspace"> </span><span class="RktSym">m</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">c%</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span><span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._object~25%29%29" class="RktValLink" data-pltdoc="x">object%</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define%2Fpublic%29%29" class="RktStxLink" data-pltdoc="x">define/public</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">m</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">10</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super-new%29%29" class="RktStxLink" data-pltdoc="x">super-new</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktSym">o</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._new%29%29" class="RktStxLink" data-pltdoc="x">new</a></span><span class="hspace"> </span><span class="RktSym">c%</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="values.html#%28def._%28%28quote._~23~25kernel%29._values%29%29" class="RktValLink" data-pltdoc="x">values</a>
|
||
|
an expression. The value of <span class="RktVar">key-expr</span> must be the result of either a
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key%29%29" class="RktStxLink" data-pltdoc="x">member-name-key</a></span> expression or a <span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._generate-member-key%29%29" class="RktValLink" data-pltdoc="x">generate-member-key</a></span> call.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>syntax</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(form._((lib._racket/private/class-internal..rkt)._member-name-key))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key%29%29" class="RktStxDef RktStxLink" data-pltdoc="x">member-name-key</a></span></span><span class="hspace"> </span><span class="RktVar">identifier</span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Produces a representation of the external name for <span class="RktSym">id</span> in the
|
||
|
environment of the <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key%29%29" class="RktStxLink" data-pltdoc="x">member-name-key</a></span> expression.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/private/class-internal..rkt)._generate-member-key))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._generate-member-key%29%29" class="RktValDef RktValLink" data-pltdoc="x">generate-member-key</a></span></span><span class="RktPn"></span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key~3f%29%29" class="RktValLink" data-pltdoc="x">member-name-key?</a></span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">Produces a hidden name, just like the binding for
|
||
|
<span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-local-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-local-member-name</a></span>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/private/class-internal..rkt)._member-name-key~3f))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">member-name-key?</a></span></span><span class="hspace"> </span><span class="RktVar">v</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">v</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="data-structure-contracts.html#%28def._%28%28lib._racket%2Fcontract%2Fprivate%2Fmisc..rkt%29._any%2Fc%29%29" class="RktValLink" data-pltdoc="x">any/c</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Returns <span class="RktVal">#t</span> for values produced by <span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key%29%29" class="RktStxLink" data-pltdoc="x">member-name-key</a></span>
|
||
|
and <span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._generate-member-key%29%29" class="RktValLink" data-pltdoc="x">generate-member-key</a></span>, <span class="RktVal">#f</span>
|
||
|
otherwise.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/private/class-internal..rkt)._member-name-key~3d~3f))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key~3d~3f%29%29" class="RktValDef RktValLink" data-pltdoc="x">member-name-key=?</a></span></span><span class="hspace"> </span><span class="RktVar">a-key</span><span class="hspace"> </span><span class="RktVar">b-key</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="booleans.html#%28def._%28%28quote._~23~25kernel%29._boolean~3f%29%29" class="RktValLink" data-pltdoc="x">boolean?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">a-key</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key~3f%29%29" class="RktValLink" data-pltdoc="x">member-name-key?</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">b-key</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key~3f%29%29" class="RktValLink" data-pltdoc="x">member-name-key?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Produces <span class="RktVal">#t</span> if member-name keys <span class="RktVar">a-key</span> and
|
||
|
<span class="RktVar">b-key</span> represent the same external name, <span class="RktVal">#f</span>
|
||
|
otherwise.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._((lib._racket/private/class-internal..rkt)._member-name-key-hash-code))"></a><span title="Provided from: racket/class, racket | Package: base"><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key-hash-code%29%29" class="RktValDef RktValLink" data-pltdoc="x">member-name-key-hash-code</a></span></span><span class="hspace"> </span><span class="RktVar">a-key</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="number-types.html#%28def._%28%28quote._~23~25kernel%29._integer~3f%29%29" class="RktValLink" data-pltdoc="x">integer?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">a-key</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key~3f%29%29" class="RktValLink" data-pltdoc="x">member-name-key?</a></span></td></tr></table></blockquote></div><div class="SIntrapara">Produces an integer hash code consistent with
|
||
|
<span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key~3d~3f%29%29" class="RktValLink" data-pltdoc="x">member-name-key=?</a></span> comparisons, analogous to
|
||
|
<span class="RktSym"><a href="Equality.html#%28def._%28%28quote._~23~25kernel%29._equal-hash-code%29%29" class="RktValLink" data-pltdoc="x">equal-hash-code</a></span>.</div></p><p><div class="SIntrapara">Examples:</div><div class="SIntrapara"><blockquote class="SCodeFlow"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="define.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._define%29%29" class="RktStxLink" data-pltdoc="x">define</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">make-c%</span><span class="hspace"> </span><span class="RktSym">key</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define-member-name%29%29" class="RktStxLink" data-pltdoc="x">define-member-name</a></span><span class="hspace"> </span><span class="RktSym">m</span><span class="hspace"> </span><span class="RktSym">key</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._class%29%29" class="RktStxLink" data-pltdoc="x">class</a></span><span class="hspace"> </span><span class="RktSym"><a href="createclass.html#%28def._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._object~25%29%29" class="RktValLink" data-pltdoc="x">object%</a></span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._define%2Fpublic%29%29" class="RktStxLink" data-pltdoc="x">define/public</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">m</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktVal">10</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._super-new%29%29" class="RktStxLink" data-pltdoc="x">super-new</a></span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></td></tr><tr><td><p> </p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="ivaraccess.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._send%29%29" class="RktStxLink" data-pltdoc="x">send</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._new%29%29" class="RktStxLink" data-pltdoc="x">new</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">make-c%</span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="createclass.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._member-name-key%29%29" class="RktStxLink" data-pltdoc="x">member-name-key</a></span><span class="hspace"> </span><span class="RktSym">m</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="RktPn">)</span><span class="hspace"> </span><span class="RktSym">m</span><span class="RktPn">)</span></td></tr><tr><td><p><span class="RktRes">10</span></p></td></tr><tr><td><span class="stt">> </span><span class="RktPn">(</span><span class="RktSym"><a href="ivaraccess.html#%28form._%28%28lib._racket%2Fprivate%2Fclass-internal..rkt%29._send%29%29" class="RktStxLink" data-pltdoc="x">send</a></span><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="objcreation.html#%28form._
|