User Tools

A PCRE internal error occured. This might be caused by a faulty plugin

====== Standard Generic Function UPDATE-INSTANCE-FOR-DIFFERENT-CLASS ====== ====Syntax==== * **update-instance-for-different-class** //previous current ''&rest'' initargs ''&key'' ''&allow-other-keys''// → //[[CL:Glossary:implementation-dependent]]// ====Method Signatures==== * **update-instance-for-different-class** (//previous// **[[CL:Types:standard-object]]**) (//current// **[[CL:Types:standard-object]]**) //''&rest'' initargs// ====Arguments and Values==== * //previous// - a copy of the original //[[CL:Glossary:instance]]//. * //current// - the original //[[CL:Glossary:instance]]// (altered). * //initargs// - an //[[CL:Glossary:initialization argument list]]//. ====Description==== The generic function **update-instance-for-different-class** is not intended to be called by programmers. Programmers may write //[[CL:Glossary:method|methods]]// for it. The //[[CL:Glossary:function]]// **update-instance-for-different-class** is called only by the function **[[CL:Functions:change-class]]**. The system-supplied primary //[[CL:Glossary:method]]// on **update-instance-for-different-class** checks the validity of //initargs// and signals an error if an //initarg// is supplied that is not declared as valid. This //[[CL:Glossary:method]]// then initializes //[[CL:Glossary:slot|slots]]// with values according to the //initargs//, and initializes the newly added //[[CL:Glossary:slot|slots]]// with values according to their **'':initform''** forms. It does this by calling the generic function **[[CL:Functions:shared-initialize]]** with the following arguments: the instance (//current//), a list of //[[CL:Glossary:names]]// of the newly added //[[CL:Glossary:slot|slots]]//, and the //initargs// it received. Newly added //[[CL:Glossary:slot|slots]]// are those //[[CL:Glossary:local slot|local slots]]// for which no //[[CL:Glossary:slot]]// of the same name exists in the //previous// class. //[[CL:Glossary:method|Methods]]// for **update-instance-for-different-class** can be defined to specify actions to be taken when an //[[CL:Glossary:instance]]// is updated. If only //[[CL:Glossary:after methods]]// for **update-instance-for-different-class** are defined, they will be run after the system-supplied primary //[[CL:Glossary:method]]// for initialization and therefore will not interfere with the default behavior of **update-instance-for-different-class**. //[[CL:Glossary:method|Methods]]// on **update-instance-for-different-class** can be defined to initialize //[[CL:Glossary:slot|slots]]// differently from **[[CL:Functions:change-class]]**. The default behavior of **[[CL:Functions:change-class]]** is described in \secref\ChangingInstanceClass. The arguments to **update-instance-for-different-class** are computed by **[[CL:Functions:change-class]]**. When **[[CL:Functions:change-class]]** is invoked on an //[[CL:Glossary:instance]]//, a copy of that //[[CL:Glossary:instance]]// is made; **[[CL:Functions:change-class]]** then destructively alters the original //[[CL:Glossary:instance]]//. The first argument to **update-instance-for-different-class**, //previous//, is that copy; it holds the old //[[CL:Glossary:slot]]// values temporarily. This argument has dynamic extent within **[[CL:Functions:change-class]]**; if it is referenced in any way once **update-instance-for-different-class** returns, the results are undefined. The second argument to **update-instance-for-different-class**, //current//, is the altered original //[[CL:Glossary:instance]]//. The intended use of //previous// is to extract old //[[CL:Glossary:slot]]// values by using **[[CL:Functions:slot-value]]** or **[[CL:Macros:with-slots]]** or by invoking a reader generic function, or to run other //[[CL:Glossary:method|methods]]// that were applicable to //[[CL:Glossary:instances]]// of the original //[[CL:Glossary:class]]//. ====Examples==== See the example for the function **[[CL:Functions:change-class]]**. ====Affected By==== None. ====Exceptional Situations==== The system-supplied primary //[[CL:Glossary:method]]// on **update-instance-for-different-class** signals an error if an initialization argument is supplied that is not declared as valid. ====See Also==== * **[[CL:Functions:change-class|Generic Function CHANGE-CLASS]]** * **[[CL:Functions:shared-initialize|Generic Function SHARED-INITIALIZE]]** * {\secref\ChangingInstanceClass} * {\secref\InitargRules} * {\secref\DeclaringInitargValidity} ====Notes==== //initargs// are declared as valid by using the **'':initarg''** option to **[[CL:Macros:defclass]]**, or by defining //[[CL:Glossary:method|methods]]// for **update-instance-for-different-class** or **[[CL:Functions:shared-initialize]]**. The keyword name of each keyword parameter specifier in the //[[CL:Glossary:lambda list]]// of any //[[CL:Glossary:method]]// defined on **update-instance-for-different-class** or **[[CL:Functions:shared-initialize]]** is declared as a valid //initarg// name for all //[[CL:Glossary:class|classes]]// for which that //[[CL:Glossary:method]]// is applicable. The value returned by **update-instance-for-different-class** is ignored by **[[CL:Functions:change-class]]**. \issue{INITIALIZATION-FUNCTION-KEYWORD-CHECKING}