1
0
Fork 0
cl-sites/lisp-docs.github.io/cl-language-reference/chap-7/h-c-changing-the-class-of-an-instance.html

39 lines
35 KiB
HTML
Raw Normal View History

2024-03-13 23:00:32 +01:00
<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-chap-7/h-c-changing-the-class-of-an-instance" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.0.1">
<title data-rh="true">7.2 Changing the Class of an Instance | Common Lisp (New) Language Reference</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://lisp-docs.github.io/cl-language-reference/img/1024px-Lisp_logo.svg.png"><meta data-rh="true" name="twitter:image" content="https://lisp-docs.github.io/cl-language-reference/img/1024px-Lisp_logo.svg.png"><meta data-rh="true" property="og:url" content="https://lisp-docs.github.io/cl-language-reference/chap-7/h-c-changing-the-class-of-an-instance"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="google-site-verification" content="Vzaw013_bfdKeUVG89Ch3W1zC9_vH9ID2dPB9Dz0vr0"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="7.2 Changing the Class of an Instance | Common Lisp (New) Language Reference"><meta data-rh="true" name="description" content="7.2.1 Modifying the Structure of the Instance"><meta data-rh="true" property="og:description" content="7.2.1 Modifying the Structure of the Instance"><link data-rh="true" rel="icon" href="../img/favicon.ico"><link data-rh="true" rel="canonical" href="h-c-changing-the-class-of-an-instance.html"><link data-rh="true" rel="alternate" href="h-c-changing-the-class-of-an-instance.html" hreflang="en"><link data-rh="true" rel="alternate" href="h-c-changing-the-class-of-an-instance.html" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://C1F2Q5VM6X-dsn.algolia.net" crossorigin="anonymous"><link rel="preconnect" href="https://www.google-analytics.com">
<link rel="preconnect" href="https://www.googletagmanager.com">
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8TJCE4NSF8"></script>
<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-8TJCE4NSF8",{})</script>
<link rel="search" type="application/opensearchdescription+xml" title="Common Lisp (New) Language Reference" href="../opensearch.xml"><link rel="stylesheet" href="../assets/css/styles.f13b59fe.css">
<script src="../assets/js/runtime~main.02699c25.js" defer="defer"></script>
<script src="../assets/js/main.4f0a7a76.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return localStorage.getItem("theme")}catch(t){}}();t(null!==e?e:"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="h-c-changing-the-class-of-an-instance.html#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a href="../../index.html" target="_blank" rel="noopener noreferrer" class="navbar__brand"><div class="navbar__logo"><img src="../img/logo.svg" alt="Lisp Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="../img/logo.svg" alt="Lisp Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Common Lisp Docs</b></a><a href="../../docs/tutorial/index.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Tutorial</a><a href="../index.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Technical Reference</a><a href="../../docs/whylisp.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Why Lisp?</a><a href="../../docs/howto.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Guides</a></div><div class="navbar__items navbar__items--right"><a href="../../docs/contribute.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Contribute!</a><a href="../../docs/help.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Getting Help</a><a href="../../docs/about.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">About</a><a href="../../blog.html" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Blog</a><a href="https://github.com/lisp-docs" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,
<!-- -->
<p>The <span><i>function</i></span> <span><b>change-class</b></span> can be used to change the <span><i>class</i></span> of an <span><i>instance</i></span> from its current class, <em>C</em><sub>from</sub>, to a different class, <em>C</em><sub>to</sub>; it changes the structure of the <span><i>instance</i></span> to conform to the definition of the class <em>C</em><sub>to</sub>.</p>
<p>Note that changing the <span><i>class</i></span> of an <span><i>instance</i></span> may cause <span><i>slots</i></span> to be added or deleted. Changing the <span><i>class</i></span> of an <span><i>instance</i></span> does not change its identity as defined by the <span><b>eq</b></span> function.</p>
<p>When <span><b>change-class</b></span> is invoked on an <span><i>instance</i></span>, a two-step updating process takes place. The first step modifies the structure of the <span><i>instance</i></span> by adding new <span><i>local slots</i></span> and discarding <span><i>local slots</i></span> that are not specified in the new version of the <span><i>instance</i></span>. The second step initializes the newly added <span><i>local slots</i></span> and performs any other user-defined actions. These two steps are further described in the two following sections.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="721-modifying-the-structure-of-the-instance">7.2.1 Modifying the Structure of the Instance<a href="h-c-changing-the-class-of-an-instance.html#721-modifying-the-structure-of-the-instance" class="hash-link" aria-label="Direct link to 7.2.1 Modifying the Structure of the Instance" title="Direct link to 7.2.1 Modifying the Structure of the Instance"></a></h2>
<!-- -->
<p>In order to make the <span><i>instance</i></span> conform to the class <em>C</em><sub>to</sub>, <span><i>local slots</i></span> specified by the class <em>C</em><sub>to</sub> that are not specified by the class <em>C</em><sub>from</sub> are added, and <span><i>local slots</i></span> not specified by the class <em>C</em><sub>to</sub> that are specified by the class <em>C</em><sub>from</sub> are discarded.</p>
<p>The values of <span><i>local slots</i></span> specified by both the class <em>C</em><sub>to</sub> and the class <em>C</em><sub>from</sub> are retained. If such a <span><i>local slot</i></span> was unbound, it remains unbound.</p>
<p>The values of <span><i>slots</i></span> specified as shared in the class <em>C</em><sub>from</sub> and as local in the class <em>C</em><sub>to</sub> are retained. This first step of the update does not affect the values of any <span><i>shared slots</i></span>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="722-initializing-newly-added-local-slots">7.2.2 Initializing Newly Added Local Slots<a href="h-c-changing-the-class-of-an-instance.html#722-initializing-newly-added-local-slots" class="hash-link" aria-label="Direct link to 7.2.2 Initializing Newly Added Local Slots" title="Direct link to 7.2.2 Initializing Newly Added Local Slots"></a></h2>
<!-- -->
<p>The second step of the update initializes the newly added <span><i>slots</i></span> and performs any other user-defined actions. This step is implemented by the generic function <strong>update-instance-for-different-class</strong>. The generic function <strong>update-instance-for-different-class</strong> is invoked by <span><b>change-class</b></span> after the first step of the update has been completed.</p>
<p>The generic function <strong>update-instance-for-different-class</strong> is invoked on arguments computed by <span><b>change-class</b></span>. The first argument passed is a copy of the <span><i>instance</i></span> being updated and is an <span><i>instance</i></span> of the class <em>C</em><sub>from</sub>; this copy has <span><i>dynamic extent</i></span> within the generic function <span><b>change-class</b></span>. The second argument is the <span><i>instance</i></span> as updated so far by <span><b>change-class</b></span> and is an <span><i>instance</i></span> of the class <em>C</em><sub>to</sub>. The remaining arguments are an <span><i>initialization argument list</i></span>.</p>
<p>There is a system-supplied primary <span><i>method</i></span> for <strong>update-instance-for-different-class</strong> that has two parameter specializers, each of which is the <span><i>class</i></span> <span><b>standard-object</b></span>. First this <span><i>method</i></span> checks the validity of initialization arguments and signals an error if an initialization argument is supplied that is not declared as valid. (For more information, see Section 7.1.2 (Declaring the Validity of</p>
<p>Initialization Arguments).) Then it calls the generic function <span><b>shared-initialize</b></span> with the following arguments: the new <span><i>instance</i></span>, a list of <span><i>names</i></span> of the newly added <span><i>slots</i></span>, and the initialization arguments it received.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="723-customizing-the-change-of-class-of-an-instance">7.2.3 Customizing the Change of Class of an Instance<a href="h-c-changing-the-class-of-an-instance.html#723-customizing-the-change-of-class-of-an-instance" class="hash-link" aria-label="Direct link to 7.2.3 Customizing the Change of Class of an Instance" title="Direct link to 7.2.3 Customizing the Change of Class of an Instance"></a></h2>
<!-- -->
<!-- -->
<p><span><i>Methods</i></span> for <strong>update-instance-for-different-class</strong> may be defined to specify actions to be taken when an <span><i>instance</i></span> is updated. If only <span><i>after methods</i></span> for <strong>update-instance-for-different-class</strong> are defined, they will be run after the system-supplied primary <span><i>method</i></span> for initialization and will not interfere with the default behavior of <strong>update-instance-for-different-class</strong>.</p>
<p><span><i>Methods</i></span> for <span><b>shared-initialize</b></span> may be defined to customize <span><i>class</i></span> redefinition. For more information, see Section 7.1.5 (Shared-Initialize).</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/lisp-docs/cl-language-reference/tree/main/docs/chap-7/h-c-changing-the-class-of-an-instance.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_vwxv"><span class="theme-last-updated">Last updated<!-- --> by <b>daninus14</b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="h-b-object-creation-and-initialization.html"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">7.1 Object Creation and Initialization</div></a><a class="pagination-nav__link pagination-nav__link--next" href="h-d-reinitializing-an-instance.html"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">7.3 Reinitializing an Instance</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="h-c-changing-the-class-of-an-instance.html#721-modifying-the-structure-of-the-instance" class="table-of-contents__link toc-highlight">7.2.1 Modifying the Structure of the Instance</a></li><li><a href="h-c-changing-the-class-of-an-instance.html#722-initializing-newly-added-local-slots" class="table-of-contents__link toc-highlight">7.2.2 Initializing Newly Added Local Slots</a></li><li><a href="h-c-changing-the-class-of-an-instance.html#723-customizing-the-change-of-class-of-an-instance" class="table-of-contents__link toc-highlight">7.2.3 Customizing the Change of Class of an Instance</a></li></ul></div></div></div></div></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a href="../../docs/tutorial.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Common Lisp Tutorial</a></li><li class="footer__item"><a href="../index.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Common Lisp Technical Reference</a></li><li class="footer__item"><a href="../../docs/help.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Help</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/common-lisp" target="_blank" rel="noopener noreferrer" class="footer__link-item">Stack Overflow<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://discord.gg/hhk46CE" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.reddit.com/r/common_lisp" target="_blank" rel="noopener noreferrer" class="footer__li
</body>
</html>