67 lines
88 KiB
HTML
67 lines
88 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-meta-object-protocol/dictionary/make-method-lambda" data-has-hydrated="false">
|
|||
|
<head>
|
|||
|
<meta charset="UTF-8">
|
|||
|
<meta name="generator" content="Docusaurus v3.0.1">
|
|||
|
<title data-rh="true">make-method-lambda | 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/meta-object-protocol/dictionary/make-method-lambda"><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="make-method-lambda | Common Lisp (New) Language Reference"><meta data-rh="true" name="description" content="Generic Function MAKE-METHOD-LAMBDA"><meta data-rh="true" property="og:description" content="Generic Function MAKE-METHOD-LAMBDA"><link data-rh="true" rel="icon" href="../../img/favicon.ico"><link data-rh="true" rel="canonical" href="make-method-lambda.html"><link data-rh="true" rel="alternate" href="make-method-lambda.html" hreflang="en"><link data-rh="true" rel="alternate" href="make-method-lambda.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="make-method-lambda.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,
|
|||
|
<p><em>Generic Function</em> <strong>MAKE-METHOD-LAMBDA</strong></p>
|
|||
|
<p><strong>Syntax:</strong></p>
|
|||
|
<p><strong>make-method-lambda</strong> <em>generic-function</em> <em>method</em> <em>lambda-expression</em> <em>environment</em> => <em>resulting-lambda-expression</em>, <em>initargs</em></p>
|
|||
|
<p><strong>Arguments and values:</strong></p>
|
|||
|
<p><em>generic-function</em> -- A generic function metaobject.</p>
|
|||
|
<p><em>method</em> -- A (possibly uninitialized) method metaobject.</p>
|
|||
|
<p><em>lambda-expression</em> -- A lambda expression.</p>
|
|||
|
<p><em>environment</em> -- An<a href="http://www.lispworks.com/documentation/HyperSpec/Body/03_aad.htm" target="_blank" rel="noopener noreferrer">environment object</a>.</p>
|
|||
|
<p><em>resulting-lambda-expression</em> -- A lambda expression.</p>
|
|||
|
<p><em>initargs</em> -- A list of initialization arguments and values.</p>
|
|||
|
<p><strong>Description:</strong></p>
|
|||
|
<p>This generic function is called to produce a lambda expression which can itself be used to produce a method function for a method and generic function with the specified classes. The generic function and method the method function will be used with are not required to be the given ones. Moreover, the method metaobject may be uninitialized.</p>
|
|||
|
<p>Either the function <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_cmp.htm#compile" target="_blank" rel="noopener noreferrer">compile</a>, the special form <a href="http://www.lispworks.com/documentation/HyperSpec/Body/s_fn.htm" target="_blank" rel="noopener noreferrer">function</a> or the function <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_coerce.htm#coerce" target="_blank" rel="noopener noreferrer">coerce</a> must be used to convert the lambda expression to a method function. The method function itself can be applied to arguments with <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_apply.htm#apply" target="_blank" rel="noopener noreferrer">apply</a> or <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_funcal.htm#funcall" target="_blank" rel="noopener noreferrer">funcall</a>.</p>
|
|||
|
<p>When a method is actually called by an effective method, its first argument will be a list of the arguments to the generic function. Its remaining arguments will be all but the first argument passed to <a href="http://www.lispworks.com/documentation/HyperSpec/Body/m_call_m.htm#call-method" target="_blank" rel="noopener noreferrer">call-method</a>. By default, all method functions must accept two arguments: the list of arguments to the generic function and the list of next methods.</p>
|
|||
|
<p>For a given generic function and method class, the applicable methods on <code>make-method-lambda</code> and <a href="https://lisp-docs.github.io/cl-language-reference/meta-object-protocol/compute-effective-method">compute-effective-method</a> must be consistent in the following way: each use of <a href="http://www.lispworks.com/documentation/HyperSpec/Body/m_call_m.htm#call-method" target="_blank" rel="noopener noreferrer">call-method</a> returned by the method on <a href="https://lisp-docs.github.io/cl-language-reference/meta-object-protocol/compute-effective-method">compute-effective-method</a> must have the same number of arguments, and the method lambda returned by the method on <code>make-method-lambda</code> must accept a corresponding number of arguments.</p>
|
|||
|
<p>Note that the system-supplied implementation of <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_call_n.htm#call-next-method" target="_blank" rel="noopener noreferrer">call-next-method</a> is not required to handle extra arguments to the method function. Users who define additional arguments to the method function must either redefine or forego <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_call_n.htm#call-next-method" target="_blank" rel="noopener noreferrer">call-next-method</a>. (See the example below.)</p>
|
|||
|
<p>When the method metaobject is created with <a href="https://lisp-docs.github.io/cl-language-reference/meta-object-protocol/make-instance">make-instance</a>, the method function must be the value of the <code>:function</code> initialization argument. The additional initialization arguments, returned as the second value of this generic function, must also be passed in this call to <a href="https://lisp-docs.github.io/cl-language-reference/meta-object-protocol/make-instance">make-instance</a>.</p>
|
|||
|
<p><strong>Methods:</strong></p>
|
|||
|
<hr>
|
|||
|
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="make-method-lambda-generic-function-standard-generic-function-method-standard-method-lambda-expression-environment"><a href="https://lisp-docs.github.io/cl-language-reference/meta-object-protocol/make-method-lambda-standard-generic-function-standard-method"><strong>make-method-lambda</strong> (<em>generic-function</em> standard-generic-function) (<em>method</em> standard-method) <em>lambda-expression</em> <em>environment</em></a><a href="make-method-lambda.html#make-method-lambda-generic-function-standard-generic-function-method-standard-method-lambda-expression-environment" class="hash-link" aria-label="Direct link to make-method-lambda-generic-function-standard-generic-function-method-standard-method-lambda-expression-environment" title="Direct link to make-method-lambda-generic-function-standard-generic-function-method-standard-method-lambda-expression-environment"></a></h2>
|
|||
|
<p><strong>Example:</strong></p>
|
|||
|
<p>This example shows how to define a kind of method which, from within the body of the method, has access to the actual method metaobject for the method. This simplified code overrides whatever method combination is specified for the generic function, implementing a simple method combination supporting only primary methods, <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_call_n.htm#call-next-method" target="_blank" rel="noopener noreferrer">call-next-method</a> and <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_next_m.htm#next-method-p" target="_blank" rel="noopener noreferrer">next-method-p</a>. (In addition, its a simplified version of <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_call_n.htm#call-next-method" target="_blank" rel="noopener noreferrer">call-next-method</a> which does no error checking.)</p>
|
|||
|
<p>Notice that the extra lexical function bindings get wrapped around the body before <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_call_n.htm#call-next-method" target="_blank" rel="noopener noreferrer">call-next-method</a> is called. In this way, the user's definition of <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_call_n.htm#call-next-method" target="_blank" rel="noopener noreferrer">call-next-method</a> and <a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_next_m.htm#next-method-p" target="_blank" rel="noopener noreferrer">next-method-p</a> are sure to override the system's definitions.</p>
|
|||
|
<p>(defclass my-generic-function (standard-generic-function)
|
|||
|
()
|
|||
|
(<!-- -->:default-initargs<!-- --> <!-- -->:method-class<!-- --> (find-class 'my-method)))</p>
|
|||
|
<p>(defclass my-method (standard-method) ())</p>
|
|||
|
<p>(defmethod make-method-lambda ((gf my-generic-function)
|
|||
|
(method my-method)
|
|||
|
lambda-expression
|
|||
|
environment)
|
|||
|
(declare (ignore environment))
|
|||
|
<code>(lambda (args next-methods this-method) (,(call-next-method gf method </code>(lambda ,(cadr lambda-expression)
|
|||
|
(flet ((this-method () this-method)
|
|||
|
(call-next-method (&rest cnm-args)
|
|||
|
(funcall (method-function (car next-methods))
|
|||
|
(or cnm-args args)
|
|||
|
(cdr next-methods)
|
|||
|
(car next-methods)))
|
|||
|
(next-method-p ()
|
|||
|
(not (null next-methods))))
|
|||
|
,@(cddr lambda-expression)))
|
|||
|
environment)
|
|||
|
args next-methods)))</p>
|
|||
|
<p>(defmethod compute-effective-method ((gf my-generic-function)
|
|||
|
method-combination
|
|||
|
methods)
|
|||
|
`(call-method ,(car methods) ,(cdr methods) ,(car methods)))</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/lisp-docs/cl-language-reference/tree/main/docs/meta-object-protocol/dictionary/make-method-lambda.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="make-method-lambda-standard-generic-function-standard-method.html"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">make-method-lambda-standard-generic-function-standard-method</div></a><a class="pagination-nav__link pagination-nav__link--next" href="map-dependents-funcallable-standard-class.html"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">map-dependents-funcallable-standard-class</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="make-method-lambda.html#make-method-lambda-generic-function-standard-generic-function-method-standard-method-lambda-expression-environment" class="table-of-contents__link toc-highlight"><strong>make-method-lambda</strong> (<em>generic-function</em> standard-generic-function) (<em>method</em> standard-method) <em>lambda-expression</em> <em>environment</em></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="fo
|
|||
|
</body>
|
|||
|
</html>
|