136 lines
No EOL
122 KiB
HTML
136 lines
No EOL
122 KiB
HTML
<!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-h-dictionary/define-method-combination_macro" data-has-hydrated="false">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="generator" content="Docusaurus v3.0.1">
|
||
<title data-rh="true">define-method-combination | 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-h-dictionary/define-method-combination_macro"><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="define-method-combination | Common Lisp (New) Language Reference"><meta data-rh="true" name="description" content="Expanded Reference: define-method-combination"><meta data-rh="true" property="og:description" content="Expanded Reference: define-method-combination"><link data-rh="true" rel="icon" href="../../img/favicon.ico"><link data-rh="true" rel="canonical" href="define-method-combination_macro.html"><link data-rh="true" rel="alternate" href="define-method-combination_macro.html" hreflang="en"><link data-rh="true" rel="alternate" href="define-method-combination_macro.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="define-method-combination_macro.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,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../../index.html">Introduction</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-0/intro.html">Contents and Figures</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-1/b-b-scope-purpose-and-history.html">1. Introduction</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-2/c-b-character-syntax.html">2. Syntax</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-3/d-b-evaluation.html">3. Evaluation and Compilation</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-4/e-b-introduction.html">4. Types and Classes</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-5/f-b-generalized-reference.html">5. Data and Control Flow</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-6/g-b-the-loop-facility.html">6. Iteration</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" aria-expanded="true" href="../h-b-object-creation-and-initialization.html">7. Objects</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="../h-b-object-creation-and-initialization.html">7.1 Object Creation and Initialization</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="../h-c-changing-the-class-of-an-instance.html">7.2 Changing the Class of an Instance</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="../h-d-reinitializing-an-instance.html">7.3 Reinitializing an Instance</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="../h-e-metaobjects.html">7.4 Meta</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="../h-f-slots.html">7.5 Slots</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="../h-g-generic-functions-and-methods.html">7.6 Generic Functions and Methods</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" tabindex="0" href="../../category/77-objects-dictionary.html">7.7 Objects Dictionary</a><button aria-label="Collapse sidebar category '7.7 Objects Dictionary'" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="add-method_standard-generic-function.html">add-method</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="allocate-instance_standard-generic-function.html">allocate-instance</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="call-method_make-method_local-macro.html">call-method, make-method</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="call-next-method_local-function.html">call-next-method</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="change-class_standard-generic-function.html">change-class</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="class-name_standard-generic-function.html">class-name</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="class-of_function.html">class-of</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="compute-applicable-methods_standard-generic-function.html">compute-applicable-methods</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="defclass_macro.html">defclass</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="defgeneric_macro.html">defgeneric</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="define-method-combination_macro.html">define-method-combination</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="defmethod_macro.html">defmethod</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="ensure-generic-function_function.html">ensure-generic-function</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="find-class_accessor.html">find-class</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="find-method_standard-generic-function.html">find-method</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="function-keywords_standard-generic-function.html">function-keywords</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="initialize-instance_standard-generic-function.html">initialize-instance</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="make-instance_standard-generic-function.html">make-instance</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="make-instances-obsolete_standard-generic-function.html">make-instances-obsolete</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="make-load-form-saving-slots_function.html">make-load-form-saving-slots</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="make-load-form_standard-generic-function.html">make-load-form</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="method-qualifiers_standard-generic-function.html">method-qualifiers</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="next-method-p_local-function.html">next-method-p</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="no-applicable-method_standard-generic-function.html">no-applicable-method</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="no-next-method_standard-generic-function.html">no-next-method</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="reinitialize-instance_standard-generic-function.html">reinitialize-instance</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="remove-method_standard-generic-function.html">remove-method</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="shared-initialize_standard-generic-function.html">shared-initialize</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="slot-boundp_function.html">slot-boundp</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="slot-exists-p_function.html">slot-exists-p</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="slot-makunbound_function.html">slot-makunbound</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="slot-missing_standard-generic-function.html">slot-missing</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="slot-unbound_standard-generic-function.html">slot-unbound</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="slot-value_function.html">slot-value</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="unbound-slot-instance_function.html">unbound-slot-instance</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="unbound-slot_condition-type.html">unbound-slot</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="update-instance-for-different-class_standard-generic-function.html">update-instance-for-different-class</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="update-instance-for-redefined-class_standard-generic-function.html">update-instance-for-redefined-class</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="with-accessors_macro.html">with-accessors</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="with-slots_macro.html">with-slots</a></li></ul></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../category/81-structures-dictionary.html">8. Structures</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-9/j-b-condition-system-concepts.html">9. Conditions</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-10/ba-b-symbol-concepts.html">10. Symbols</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-11/bb-b-package-concepts.html">11. Packages</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-12/bc-b-number-concepts.html">12. Numbers</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-13/bd-b-character-concepts.html">13. Characters</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-14/be-b-cons-concepts.html">14. Conses</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-15/bf-b-array-concepts.html">15. Arrays</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-16/bg-b-string-concepts.html">16. Strings</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-17/bh-b-sequence-concepts.html">17. Sequences</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-18/bi-b-hash-table-concepts.html">18. Hash Tables</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-19/bj-b-overview-of-filenames.html">19. Filenames</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-20/ca-b-file-system-concepts.html">20. Files</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-21/cb-b-stream-concepts.html">21. Streams</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-22/cc-b-the-lisp-printer.html">22. Printer</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-23/cd-b-reader-concepts.html">23. Reader</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-24/ce-b-system-construction-concepts.html">24. System Construction</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-25/cf-b-the-external-environment.html">25. External Environment</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" aria-expanded="true" href="../../environments.html">26. Environments</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="../../environments.html">Environments</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" aria-expanded="true" tabindex="0" href="../../category/environments-dictionary.html">Environments Dictionary</a><button aria-label="Collapse sidebar category 'Environments Dictionary'" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="find-class_accessor.html">find-class</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="../../chap-5/f-d-dictionary/fdefinition_accessor.html">fdefinition</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="../../chap-10/ba-c-dictionary/symbol-value_accessor.html">symbol-value</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="../../chap-4/e-e-dictionary/deftype_macro.html">deftype</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="../../chap-3/d-i-dictionary/defmacro_macro.html">defmacro</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="../../chap-5/f-d-dictionary/defun_macro.html">defun</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="defgeneric_macro.html">defgeneric</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="define-method-combination_macro.html">define-method-combination</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="../../chap-5/f-d-dictionary/defparameter_defvar_macro.html">defparameter, defvar</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="defclass_macro.html">defclass</a></li></ul></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../meta-object-protocol.html">27. Meta Object Protocol</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../data-structures.html">28. Data Structures</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../portability/trivial-packages.html">29. Portability</a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="../../dictionary-entries.html">dictionary-entries</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="../../chap-26/intro.html">Glossary</a></div></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="../../index.html"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">7. Objects</span><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="../../category/77-objects-dictionary.html"><span itemprop="name">7.7 Objects Dictionary</span></a><meta itemprop="position" content="2"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">define-method-combination</span><meta itemprop="position" content="3"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><h1>define-method-combination</h1>
|
||
<!-- -->
|
||
<!-- -->
|
||
<p><strong>define-method-combination</strong> <span><i>Macro</i></span></p>
|
||
<p><strong>Syntax:</strong></p>
|
||
<p><span><b>define-method-combination</b></span> <span><i>name</i></span> [[ <em>↓short-form-option</em> ]]</p>
|
||
<p>→ name</p>
|
||
<p><span><b>define-method-combination</b></span> <em>name lambda-list</em></p>
|
||
<p>(<em>{method-group-specifier}</em>*)</p>
|
||
<p>[(<!-- -->:arguments<!-- --> <em>. args-lambda-list</em>)]</p>
|
||
<p>[(<!-- -->:generic-function<!-- --> <em>generic-function-symbol</em>)]</p>
|
||
<p>[[ <span><i>{declaration}</i></span>* <em>| documentation</em> ]]</p>
|
||
<p><span><i>{form}</i></span>*</p>
|
||
<p>→ name</p>
|
||
<p><em>short-form-option::</em>=<!-- -->:documentation<!-- --> <em>documentation |</em></p>
|
||
<p>:identity-with-one-argument<!-- --> <em>identity-with-one-argument |</em></p>
|
||
<p>:operator<!-- --> <span><i>operator</i></span></p>
|
||
<p><em>method-group-specifier::</em>=(<em>name {{qualifier-pattern}</em><sup>+</sup><em>| predicate}</em> [[ <em>↓long-form-option</em> ]])</p>
|
||
<p><em>long-form-option::</em>=<!-- -->:description<!-- --> <em>description |</em></p>
|
||
<p>:order<!-- --> <em>order |</em></p>
|
||
<p>:required<!-- --> <em>required-p</em></p>
|
||
<p><strong>Arguments and Values:</strong></p>
|
||
<p><em>args-lambda-list</em>—a <em>define-method-combination arguments lambda list</em>.</p>
|
||
<p><span><i>declaration</i></span>—a <span><b>declare</b></span> <span><i>expression</i></span>; not evaluated.</p>
|
||
<p><em>description</em>—a <span><i>format control</i></span>.</p>
|
||
<p><em>documentation</em>—a <span><i>string</i></span>; not evaluated.</p>
|
||
<p><span><i>forms</i></span>—an <span><i>implicit progn</i></span> that must compute and return the <span><i>form</i></span> that specifies how the <span><i>methods</i></span> are combined, that is, the <span><i>effective method</i></span>.</p>
|
||
<span><b>define-method-combination</b></span>
|
||
<p><em>generic-function-symbol</em>—a <span><i>symbol</i></span>.</p>
|
||
<p><em>identity-with-one-argument</em>—a <span><i>generalized boolean</i></span>.</p>
|
||
<p><em>lambda-list</em>—<span><i>ordinary lambda list</i></span>.</p>
|
||
<p><span><i>name</i></span>—a <span><i>symbol</i></span>. Non-<span><i>keyword</i></span>, <em>non-nil symbols</em> are usually used.</p>
|
||
<p><span><i>operator</i></span>—an <span><i>operator</i></span> . <span><i>Name</i></span> and <span><i>operator</i></span> are often the <em>same symbol</em>. This is the default, but it is not required.</p>
|
||
<p><em>order</em>—<!-- -->:most-specific-first<!-- --> or <!-- -->:most-specific-last<!-- -->; evaluated.</p>
|
||
<p><span><i>predicate</i></span>—a <span><i>symbol</i></span> that names a <span><i>function</i></span> of one argument that returns a <span><i>generalized boolean</i></span>. <em>qualifier-pattern</em>—a <span><i>list</i></span>, or the <span><i>symbol</i></span> <strong>*</strong>.</p>
|
||
<p><em>required-p</em>—a <span><i>generalized boolean</i></span>.</p>
|
||
<p><strong>Description:</strong></p>
|
||
<p>The macro <span><b>define-method-combination</b></span> is used to define new types of method combination.</p>
|
||
<p>There are two forms of <span><b>define-method-combination</b></span>. The short form is a simple facility for the cases that are expected to be most commonly needed. The long form is more powerful but more verbose. It resembles <span><b>defmacro</b></span> in that the body is an expression, usually using backquote, that computes a <span><i>form</i></span>. Thus arbitrary control structures can be implemented. The long form also allows</p>
|
||
<p>arbitrary processing of method <span><i>qualifiers</i></span>.</p>
|
||
<p><strong>Short Form</strong></p>
|
||
<p>The short form syntax of <span><b>define-method-combination</b></span> is recognized when the sec ond <span><i>subform</i></span> is a <span><i>non-nil</i></span> symbol or is not present. When the short form is</p>
|
||
<p>used, <span><i>name</i></span> is defined as a type of method combination that produces a Lisp form (<em>operator method-call method-call . . .</em>). The <span><i>operator</i></span> is a <span><i>symbol</i></span> that can be the <span><i>name</i></span> of a <span><i>function</i></span>, <span><i>macro</i></span>, or <span><i>special operator</i></span> . The <span><i>operator</i></span> can be supplied by a keyword option; it defaults to <span><i>name</i></span>.</p>
|
||
<p>Keyword options for the short form are the following:</p>
|
||
<p><em>•</em> The <!-- -->:documentation<!-- --> option is used to document the method-combination type; see description of long form below.</p>
|
||
<p><em>•</em> The <!-- -->:identity-with-one-argument<!-- --> option enables an optimization when its value is <span><i>true</i></span> (the default is <span><i>false</i></span>). If there is exactly one applicable method and it is a</p>
|
||
<p>primary method, that method serves as the effective method and <span><i>operator</i></span> is not</p>
|
||
<p>called. This optimization avoids the need to create a new effective method and</p>
|
||
<p>avoids the overhead of a <span><i>function</i></span> call. This option is designed to be used with</p>
|
||
<p>operators such as <span><b>progn</b></span>, <span><b>and</b></span>, +, and <span><b>max</b></span>.</p>
|
||
<span><b>define-method-combination</b></span>
|
||
<p><em>•</em> The <!-- -->:operator<!-- --> option specifies the <span><i>name</i></span> of the operator. The <span><i>operator</i></span> argument is a <span><i>symbol</i></span> that can be the <span><i>name</i></span> of a <span><i>function</i></span>, <span><i>macro</i></span>, or <span><i>special form</i></span>.</p>
|
||
<p>These types of method combination require exactly one <span><i>qualifier</i></span> per method. An error is signaled if there are applicable methods with no <span><i>qualifiers</i></span> or with <span><i>qualifiers</i></span> that are not supported by the method combination type.</p>
|
||
<p>A method combination procedure defined in this way recognizes two roles for methods. A method whose one <span><i>qualifier</i></span> is the symbol naming this type of method combination is defined to be a primary method. At least one primary method must be applicable or an error is signaled. A method with <!-- -->:around<!-- --> as its one <span><i>qualifier</i></span> is an auxiliary method that behaves the same as an <span><i>around method</i></span> in standard method combination. The <span><i>function</i></span></p>
|
||
<p><span><b>call-next-method</b></span> can only be used in <span><i>around methods</i></span>; it cannot be used in primary methods defined by the short form of the <span><b>define-method-combination</b></span> macro.</p>
|
||
<p>A method combination procedure defined in this way accepts an optional argument named <em>order</em>, which defaults to <!-- -->:most-specific-first<!-- -->. A value of <!-- -->:most-specific-last<!-- --> reverses the order of the primary methods without affecting the order of the auxiliary methods.</p>
|
||
<p>The short form automatically includes error checking and support for <span><i>around methods</i></span>.</p>
|
||
<p>For a discussion of built-in method combination types, see Section 7.6.6.4 (Built-in Method Combination Types).</p>
|
||
<p><strong>Long Form</strong></p>
|
||
<p>The long form syntax of <span><b>define-method-combination</b></span> is recognized when the second <span><i>subform</i></span> is a list.</p>
|
||
<p>The <em>lambda-list</em> receives any arguments provided after the <span><i>name</i></span> of the method combination type in the <!-- -->:method-combination<!-- --> option to <span><b>defgeneric</b></span>.</p>
|
||
<p>A list of method group specifiers follows. Each specifier selects a subset of the applicable methods to play a particular role, either by matching their <span><i>qualifiers</i></span> against some patterns or by testing their <span><i>qualifiers</i></span> with a <span><i>predicate</i></span>. These method group specifiers define all method <span><i>qualifiers</i></span> that can be used with this type of method combination.</p>
|
||
<p>The <span><i>car</i></span> of each <em>method-group-specifier</em> is a <span><i>symbol</i></span> which <span><i>names</i></span> a <span><i>variable</i></span>. During the execution of the <span><i>forms</i></span> in the body of <span><b>define-method-combination</b></span>, this <span><i>variable</i></span> is bound to a list of the <span><i>methods</i></span> in the method group. The <span><i>methods</i></span> in this list occur in the order specified by the <!-- -->:order<!-- --> option.</p>
|
||
<p>If <em>qualifier-pattern</em> is a <span><i>symbol</i></span> it must be <strong>*</strong>. A method matches a <em>qualifier-pattern</em> if the method’s list of <span><i>qualifiers</i></span> is <span><b>equal</b></span> to the <em>qualifier-pattern</em> (except that the symbol <strong>*</strong> in a <em>qualifier-pattern</em> matches anything). Thus a <em>qualifier-pattern</em> can be one of the following: the <span><i>empty list</i></span>, which matches <span><i>unqualified methods</i></span>; the symbol <strong>*</strong>, which matches all methods; a true list, which matches methods with the same number of <span><i>qualifiers</i></span> as the length of the list when each <span><i>qualifier</i></span> matches the corresponding list element; or a dotted list that ends</p>
|
||
<span><b>define-method-combination</b></span>
|
||
<p>in the symbol <strong>*</strong> (the <strong>*</strong> matches any number of additional <span><i>qualifiers</i></span>).</p>
|
||
<p>Each applicable method is tested against the <em>qualifier-patterns</em> and <span><i>predicates</i></span> in left-to-right order. As soon as a <em>qualifier-pattern</em> matches or a <span><i>predicate</i></span> returns true, the method becomes a member of the corresponding method group and no further tests are made. Thus if a method could be a member of more than one method group, it joins only the first such group. If a method group has more than one <em>qualifier-pattern</em>, a method need only satisfy one of the <em>qualifier-patterns</em> to be a member of the group.</p>
|
||
<p>The <span><i>name</i></span> of a <span><i>predicate</i></span> function can appear instead of <em>qualifier-patterns</em> in a method group specifier. The <span><i>predicate</i></span> is called for each method that has not been assigned to an earlier method group; it is called with one argument, the method’s <em>qualifier list</em>. The <span><i>predicate</i></span> should return true if the method is to be a member of the method group. A <span><i>predicate</i></span> can be distinguished from a <em>qualifier-pattern</em> because it is a <span><i>symbol</i></span> other than <span><b>nil</b></span> or <strong>*</strong>.</p>
|
||
<p>If there is an applicable method that does not fall into any method group, the <span><i>function</i></span> <span><b>invalid-method-error</b></span> is called.</p>
|
||
<p>Method group specifiers can have keyword options following the <span><i>qualifier</i></span> patterns or predicate. Keyword options can be distinguished from additional <span><i>qualifier</i></span> patterns because they are neither lists nor the symbol <strong>*</strong>. The keyword options are as follows:</p>
|
||
<p><em>•</em> The <!-- -->:description<!-- --> option is used to provide a description of the role of methods in the method group. Programming environment tools use (apply #’format stream</p>
|
||
<p><em>format-control</em> (method-qualifiers <span><i>method</i></span>)) to print this description, which is</p>
|
||
<p>expected to be concise. This keyword option allows the description of a method</p>
|
||
<p><span><i>qualifier</i></span> to be defined in the same module that defines the meaning of the method</p>
|
||
<p><span><i>qualifier</i></span> . In most cases, <em>format-control</em> will not contain any <span><b>format</b></span> directives,</p>
|
||
<p>but they are available for generality. If <!-- -->:description<!-- --> is not supplied, a default</p>
|
||
<p>description is generated based on the variable name and the <span><i>qualifier</i></span> patterns and</p>
|
||
<p>on whether this method group includes the <span><i>unqualified methods</i></span>.</p>
|
||
<p><em>•</em> The <!-- -->:order<!-- --> option specifies the order of methods. The <em>order</em> argument is a <span><i>form</i></span> that evaluates to <!-- -->:most-specific-first<!-- --> or <!-- -->:most-specific-last<!-- -->. If it evaluates</p>
|
||
<p>to any other value, an error is signaled. If <!-- -->:order<!-- --> is not supplied, it defaults to</p>
|
||
<p>:most-specific-first<!-- -->.</p>
|
||
<p><em>•</em> The <!-- -->:required<!-- --> option specifies whether at least one method in this method group is required. If its value is <span><i>true</i></span> and the method group is empty (that is, no</p>
|
||
<p>applicable methods match the <span><i>qualifier</i></span> patterns or satisfy the predicate), an error</p>
|
||
<p>is signaled. If <!-- -->:required<!-- --> is not supplied, it defaults to <span><b>nil</b></span>.</p>
|
||
<p>The use of method group specifiers provides a convenient syntax to select methods, to divide them among the possible roles, and to perform the necessary error checking. It is possible to perform further filtering of methods in the body <span><i>forms</i></span> by using normal list-processing operations and the functions <span><b>method-qualifiers</b></span> and <span><b>invalid-method-error</b></span>.</p>
|
||
<p>It is permissible to use <span><b>setq</b></span> on the variables named in the method group specifiers and</p>
|
||
<span><b>define-method-combination</b></span>
|
||
<p>to bind additional variables. It is also possible to bypass the method group specifier mechanism and do everything in the body <span><i>forms</i></span>. This is accomplished by writing a single method group with <strong>*</strong> as its only <em>qualifier-pattern</em>; the variable is then bound to a <span><i>list</i></span> of all of the <span><i>applicable methods</i></span>, in most-specific-first order.</p>
|
||
<p>The body <span><i>forms</i></span> compute and return the <span><i>form</i></span> that specifies how the methods are combined, that is, the e↵ective method. The e↵ective method is evaluated in the <span><i>null lexical environment</i></span> augmented with a local macro definition for <span><b>call-method</b></span> and with bindings named by symbols not <span><i>accessible</i></span> from the COMMON-LISP-USER <span><i>package</i></span>. Given a method object in one of the <span><i>lists</i></span> produced by the method group specifiers and a <span><i>list</i></span> of next methods, <span><b>call-method</b></span> will invoke the method such that <span><b>call-next-method</b></span> has available the next methods.</p>
|
||
<p>When an e↵ective method has no e↵ect other than to call a single method, some implementations employ an optimization that uses the single method directly as the e↵ective method, thus avoiding the need to create a new e↵ective method. This optimization is active when the e↵ective method form consists entirely of an invocation of the <span><b>call-method</b></span> macro whose first <span><i>subform</i></span> is a method object and whose second <span><i>subform</i></span> is <span><b>nil</b></span> or unsupplied. Each <span><b>define-method-combination</b></span> body is responsible for stripping o↵ redundant invocations of <span><b>progn</b></span>, <span><b>and</b></span>, <span><b>multiple-value-prog1</b></span>, and the like, if this optimization is desired.</p>
|
||
<p>The list (<!-- -->:arguments<!-- --> . <em>lambda-list</em>) can appear before any declarations or <span><i>documentation string</i></span>. This form is useful when the method combination type performs some specific behavior as part of the combined method and that behavior needs access to the arguments to the <span><i>generic function</i></span>. Each parameter variable defined by <em>lambda-list</em> is bound to a <span><i>form</i></span> that can be inserted into the e↵ective method. When this <span><i>form</i></span> is evaluated during execution of the e↵ective method, its value is the corresponding argument to the <span><i>generic function</i></span>; the consequences of using such a <span><i>form</i></span> as the <span><i>place</i></span> in a <span><b>setf</b></span> <span><i>form</i></span> are undefined. Argument correspondence is computed by dividing the <!-- -->:arguments<!-- --> <em>lambda-list</em> and the <em>generic function lambda-list</em> into three sections: the <span><i>required parameters</i></span>, the <span><i>optional parameters</i></span>, and the <span><i>keyword</i></span> and <span><i>rest parameters</i></span>. The <span><i>arguments</i></span> supplied to the <span><i>generic function</i></span> for a particular <span><i>call</i></span> are also divided into three sections; the required <span><i>arguments</i></span> section contains as many <span><i>arguments</i></span> as the <span><i>generic function</i></span> has <span><i>required parameters</i></span>, the optional <span><i>arguments</i></span> section contains as many arguments as the <span><i>generic function</i></span> has <span><i>optional parameters</i></span>, and the keyword/rest <span><i>arguments</i></span> section contains the remaining arguments. Each <span><i>parameter</i></span> in the required and optional sections of the <!-- -->:arguments<!-- --> <em>lambda-list</em> accesses the argument at the same position in the corresponding section of the <span><i>arguments</i></span>. If the section of the <!-- -->:arguments<!-- --> <em>lambda-list</em> is shorter, extra <span><i>arguments</i></span> are ignored. If the section of the <!-- -->:arguments<!-- --> <em>lambda-list</em> is longer, excess <span><i>required parameters</i></span> are bound to forms that evaluate to <span><b>nil</b></span> and excess <span><i>optional parameters</i></span> are <span><i>bound</i></span> to their initforms. The <span><i>keyword parameters</i></span> and <span><i>rest parameters</i></span> in the <!-- -->:arguments<!-- --> <em>lambda-list</em> access the keyword/rest section of the <span><i>arguments</i></span>. If the <!-- -->:arguments<!-- --> <em>lambda-list</em> contains <strong>&key</strong>, it behaves as if it also contained <strong>&allow-other-keys</strong>.</p>
|
||
<p>In addition, <strong>&whole</strong> <em>var</em> can be placed first in the <!-- -->:arguments<!-- --> <em>lambda-list</em>. It causes <em>var</em> to</p>
|
||
<span><b>define-method-combination</b></span>
|
||
<p>be <span><i>bound</i></span> to a <span><i>form</i></span> that <span><i>evaluates</i></span> to a <span><i>list</i></span> of all of the <span><i>arguments</i></span> supplied to the <span><i>generic function</i></span>. This is di↵erent from <strong>&rest</strong> because it accesses all of the arguments, not just the keyword/rest <span><i>arguments</i></span>.</p>
|
||
<p>Erroneous conditions detected by the body should be reported with</p>
|
||
<p><span><b>method-combination-error</b></span> or <span><b>invalid-method-error</b></span>; these <span><i>functions</i></span> add any nec essary contextual information to the error message and will signal the appropriate error.</p>
|
||
<p>The body <span><i>forms</i></span> are evaluated inside of the <span><i>bindings</i></span> created by the <span><i>lambda list</i></span> and method group specifiers. Declarations at the head of the body are positioned directly inside of <span><i>bindings</i></span> created by the <span><i>lambda list</i></span> and outside of the <span><i>bindings</i></span> of the method group variables. Thus method group variables cannot be declared in this way. <span><b>locally</b></span> may be used around the body, however.</p>
|
||
<p>Within the body <span><i>forms</i></span>, <em>generic-function-symbol</em> is bound to the <em>generic function object</em>.</p>
|
||
<p><em>Documentation</em> is attached as a <span><i>documentation string</i></span> to <span><i>name</i></span> (as kind</p>
|
||
<p><span><b>method-combination</b></span>) and to the <em>method combination object</em>.</p>
|
||
<p>Note that two methods with identical specializers, but with di↵erent <span><i>qualifiers</i></span>, are not ordered by the algorithm described in Step 2 of the method selection and combination process described in Section 7.6.6 (Method Selection and Combination). Normally the two methods play di↵erent roles in the e↵ective method because they have di↵erent <span><i>qualifiers</i></span>, and no matter how they are ordered in the result of Step 2, the e↵ective method is the same. If the two methods play the same role and their order matters, an error is signaled. This happens as part of the <span><i>qualifier</i></span> pattern matching in <span><b>define-method-combination</b></span>.</p>
|
||
<p>If a <span><b>define-method-combination</b></span> <span><i>form</i></span> appears as a <span><i>top level form</i></span>, the <span><i>compiler</i></span> must make the <em>method combination name</em> be recognized as a valid <em>method combination name</em> in subsequent <span><b>defgeneric</b></span> <span><i>forms</i></span>. However, the <span><i>method combination</i></span> is executed no earlier than when the <span><b>define-method-combination</b></span> <span><i>form</i></span> is executed, and possibly as late as the time that <span><i>generic functions</i></span> that use the <span><i>method combination</i></span> are executed.</p>
|
||
<p><strong>Examples:</strong></p>
|
||
<div class="language-lisp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-lisp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Most examples of the long form of **define-method-combination** also illustrate the use of the related *functions* that are provided as part of the declarative method combination facility. </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token heading comment title" style="color:#999988;font-style:italic">;;; Examples of the short form of define-method-combination </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">define-method-combination</span><span class="token plain"> and </span><span class="token lisp-property property" style="color:#36acaa">:identity-with-one-argument</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">t</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">defmethod</span><span class="token plain"> func and </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">x</span><span class="token plain"> class1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> y</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> ...</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token heading comment title" style="color:#999988;font-style:italic">;;; The equivalent of this example in the long form is: </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">define-method-combination</span><span class="token plain"> and </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> **define-method-combination** </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">&optional </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">order</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:most-specific-first</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">around</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token lisp-property property" style="color:#36acaa">:around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">primary</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">and</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:order</span><span class="token plain"> order </span><span class="token lisp-property property" style="color:#36acaa">:required</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">t</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">form</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">rest</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">mapcar</span><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">method</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,(</span><span class="token car">first</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> around </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,(</span><span class="token car">first</span><span class="token plain"> around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">rest</span><span class="token plain"> around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,form</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> form</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token heading comment title" style="color:#999988;font-style:italic">;;; Examples of the long form of define-method-combination </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;The default method-combination technique </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">define-method-combination</span><span class="token plain"> standard </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">around</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token lisp-property property" style="color:#36acaa">:around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">before</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token lisp-property property" style="color:#36acaa">:before</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">primary</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:required</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">t</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">after</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token lisp-property property" style="color:#36acaa">:after</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">flet</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-methods</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">methods</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">mapcar</span><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">method</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> methods</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">form</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> before after </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">rest</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">multiple-value-prog1</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">progn</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-methods</span><span class="token plain"> before</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,(</span><span class="token car">first</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,(</span><span class="token car">rest</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-methods</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">reverse</span><span class="token plain"> after</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,(</span><span class="token car">first</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> around </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,(</span><span class="token car">first</span><span class="token plain"> around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">rest</span><span class="token plain"> around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,form</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> form</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;A simple way to try several methods until one returns non-nil </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">define-method-combination</span><span class="token plain"> or </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">methods</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">or</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">mapcar</span><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">method</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> methods</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">**define-method-combination** </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;A more complete version of the preceding </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">define-method-combination</span><span class="token plain"> or </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">&optional </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">order</span><span class="token plain"> ’</span><span class="token lisp-property property" style="color:#36acaa">:most-specific-first</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">around</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token lisp-property property" style="color:#36acaa">:around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">primary</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">or</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;; Process the order argument </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">case</span><span class="token plain"> order </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token lisp-property property" style="color:#36acaa">:most-specific-first</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token lisp-property property" style="color:#36acaa">:most-specific-last</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">setq</span><span class="token plain"> primary </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">reverse</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">otherwise</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">method-combination-error</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"~</span><span class="token string argument" style="color:#e3116c">S</span><span class="token string" style="color:#e3116c"> is an invalid order.~@ </span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">:most-specific-first and :most-specific-last are the possible values."</span><span class="token plain"> order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;; Must have a primary method </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">unless</span><span class="token plain"> primary </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">method-combination-error</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string argument" style="color:#e3116c">A</span><span class="token string" style="color:#e3116c"> primary method is required."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;; Construct the form that calls the primary methods </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">form</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">rest</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">mapcar</span><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">method</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,(</span><span class="token car">first</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;; Wrap the around methods around that form </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> around </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,(</span><span class="token car">first</span><span class="token plain"> around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">rest</span><span class="token plain"> around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,form</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> form</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;The same thing, using the :order and :required keyword options </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">define-method-combination</span><span class="token plain"> or </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">&optional </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">order</span><span class="token plain"> ’</span><span class="token lisp-property property" style="color:#36acaa">:most-specific-first</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">around</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token lisp-property property" style="color:#36acaa">:around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">primary</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">or</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:order</span><span class="token plain"> order </span><span class="token lisp-property property" style="color:#36acaa">:required</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">t</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">form</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">rest</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">mapcar</span><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">method</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,(</span><span class="token car">first</span><span class="token plain"> primary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> around </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">,(</span><span class="token car">first</span><span class="token plain"> around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">rest</span><span class="token plain"> around</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">make-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,form</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> form</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">**define-method-combination** </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;This short-form call is behaviorally identical to the preceding </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">define-method-combination</span><span class="token plain"> or </span><span class="token lisp-property property" style="color:#36acaa">:identity-with-one-argument</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">t</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;Order methods by positive integer qualifiers </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">;:around methods are disallowed to keep the example small </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">define-method-combination</span><span class="token plain"> example-method-combination </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">methods</span><span class="token plain"> positive-integer-qualifier-p</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">progn</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">mapcar</span><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">method</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">stable-sort</span><span class="token plain"> methods #’< </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token lisp-property property" style="color:#36acaa">:key</span><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">method</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">first</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">method-qualifiers</span><span class="token plain"> method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token defun keyword" style="color:#00009f">defun</span><span class="token defun"> </span><span class="token defun function" style="color:#d73a49">positive-integer-qualifier-p</span><span class="token defun"> </span><span class="token defun punctuation" style="color:#393A34">(</span><span class="token defun arguments argument variable" style="color:#36acaa">method-qualifiers</span><span class="token defun punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">length</span><span class="token plain"> method-qualifiers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">typep</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">first</span><span class="token plain"> method-qualifiers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> ’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">integer</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> \*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token heading comment title" style="color:#999988;font-style:italic">;;; Example of the use of :arguments </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">define-method-combination</span><span class="token plain"> progn-with-lock </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">methods</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token lisp-property property" style="color:#36acaa">:arguments</span><span class="token plain"> object</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">unwind-protect</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">progn</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">lock</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">object-lock</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,object</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,@</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">mapcar</span><span class="token plain"> #’</span><span class="token punctuation" style="color:#393A34">(</span><span class="token lambda keyword" style="color:#00009f">lambda</span><span class="token lambda"> </span><span class="token lambda punctuation" style="color:#393A34">(</span><span class="token lambda arguments argument variable" style="color:#36acaa">method</span><span class="token lambda punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ‘</span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">call-method</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> methods</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">unlock</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token car">object-lock</span><span class="token plain"> </span><span class="token splice symbol variable" style="color:#36acaa">,object</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
|
||
<p><strong>Side Eects:</strong></p>
|
||
<p>The <span><i>compiler</i></span> is not required to perform any compile-time side-e↵ects.</p>
|
||
<p><strong>Exceptional Situations:</strong></p>
|
||
<p>Method combination types defined with the short form require exactly one <span><i>qualifier</i></span> per method. An error of <span><i>type</i></span> <span><b>error</b></span> is signaled if there are applicable methods with no <span><i>qualifiers</i></span> or with <span><i>qualifiers</i></span> that are not supported by the method combination type. At least one primary method must be applicable or an error of <span><i>type</i></span> <span><b>error</b></span> is signaled.</p>
|
||
<p>If an applicable method does not fall into any method group, the system signals an error of <span><i>type</i></span> <span><b>error</b></span> indicating that the method is invalid for the kind of method combination in use.</p>
|
||
<p>If the value of the <!-- -->:required<!-- --> option is <span><i>true</i></span> and the method group is empty (that is, no applicable methods match the <span><i>qualifier</i></span> patterns or satisfy the predicate), an error of <span><i>type</i></span> <span><b>error</b></span> is signaled.</p>
|
||
<p>If the <!-- -->:order<!-- --> option evaluates to a value other than <!-- -->:most-specific-first<!-- --> or <!-- -->:most-specific-last<!-- -->, an error of <span><i>type</i></span> <span><b>error</b></span> is signaled.</p>
|
||
<p><strong>See Also:</strong></p>
|
||
<p><span><b>call-method</b></span>, <span><b>call-next-method</b></span>, <strong>documentation</strong>, <span><b>method-qualifiers</b></span>, <span><b>method-combination-error</b></span>, <span><b>invalid-method-error</b></span>, <span><b>defgeneric</b></span>, Section 7.6.6 (Method Selection and Combination), Sec tion 7.6.6.4 (Built-in Method Combination Types), Section 3.4.11 (Syntactic Interaction of Documentation Strings and Declarations)</p>
|
||
<p><strong>Notes:</strong></p>
|
||
<p>The <!-- -->:method-combination<!-- --> option of <span><b>defgeneric</b></span> is used to specify that a <span><i>generic function</i></span> should use a particular method combination type. The first argument to the <!-- -->:method-combination<!-- --> option is the <span><i>name</i></span> of a method combination type and the remaining arguments are options for that type.</p>
|
||
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="expanded-reference-define-method-combination">Expanded Reference: define-method-combination<a href="define-method-combination_macro.html#expanded-reference-define-method-combination" class="hash-link" aria-label="Direct link to Expanded Reference: define-method-combination" title="Direct link to Expanded Reference: define-method-combination"></a></h2>
|
||
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>TODO: Please contribute to this page by adding explanations and examples</p></div></div>
|
||
<div class="language-lisp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-lisp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">(</span><span class="token car">define-method-combination</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></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-h-dictionary/define-method-combination_macro.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="defgeneric_macro.html"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">defgeneric</div></a><a class="pagination-nav__link pagination-nav__link--next" href="defmethod_macro.html"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">defmethod</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="define-method-combination_macro.html#expanded-reference-define-method-combination" class="table-of-contents__link toc-highlight">Expanded Reference: define-method-combination</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__link-item">Reddit<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://irclog.tymoon.eu/libera/commonlisp" target="_blank" rel="noopener noreferrer" class="footer__link-item">IRC<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></ul></div><div class="col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="../../../blog.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Blog</a></li><li class="footer__item"><a href="https://github.com/lisp-docs/lisp-docs.github.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">Tutorial and General Content 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></li><li class="footer__item"><a href="https://github.com/lisp-docs/cl-language-reference/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Technical Reference 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></li><li class="footer__item"><a href="../../../docs/contribute.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Contribute to the Docs</a></li></ul></div><div class="col footer__col"><div class="footer__title">Common Lisp Docs</div><ul class="footer__items clean-list"><li class="footer__item"><a href="../../../docs/about.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">About</a></li><li class="footer__item"><a href="../../../docs/whylisp.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Why Lisp</a></li><li class="footer__item"><a href="../../../docs/getting-started.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Getting Started</a></li><li class="footer__item"><a href="../../../docs/faq.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">FAQ</a></li><li class="footer__item"><a href="../../../docs/help.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Getting Help</a></li><li class="footer__item"><a href="../../../docs/howto.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">How To Guides</a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2024 Common Lisp Docs, MIT License (see GitHub Repo).</div></div></div></footer></div>
|
||
</body>
|
||
</html> |