1
0
Fork 0
cl-sites/guile.html_node/Next_002dmethod.html
2024-12-17 12:49:28 +01:00

115 lines
4.9 KiB
HTML

<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.1, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- This manual documents Guile version 3.0.10.
Copyright (C) 1996-1997, 2000-2005, 2009-2023 Free Software Foundation,
Inc.
Copyright (C) 2021 Maxime Devos
Copyright (C) 2024 Tomas Volf
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
copy of the license is included in the section entitled "GNU Free
Documentation License." -->
<title>Next-method (Guile Reference Manual)</title>
<meta name="description" content="Next-method (Guile Reference Manual)">
<meta name="keywords" content="Next-method (Guile Reference Manual)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content=".texi2any-real">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="index.html" rel="start" title="Top">
<link href="Concept-Index.html" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Methods-and-Generic-Functions.html" rel="up" title="Methods and Generic Functions">
<link href="Generic-Function-and-Method-Examples.html" rel="next" title="Generic Function and Method Examples">
<link href="Merging-Generics.html" rel="prev" title="Merging Generics">
<style type="text/css">
<!--
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
div.example {margin-left: 3.2em}
span:hover a.copiable-link {visibility: visible}
-->
</style>
<link rel="stylesheet" type="text/css" href="https://www.gnu.org/software/gnulib/manual.css">
</head>
<body lang="en">
<div class="subsection-level-extent" id="Next_002dmethod">
<div class="nav-panel">
<p>
Next: <a href="Generic-Function-and-Method-Examples.html" accesskey="n" rel="next">Generic Function and Method Examples</a>, Previous: <a href="Merging-Generics.html" accesskey="p" rel="prev">Merging Generics</a>, Up: <a href="Methods-and-Generic-Functions.html" accesskey="u" rel="up">Methods and Generic Functions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<h4 class="subsection" id="Next_002dmethod-1"><span>8.6.4 Next-method<a class="copiable-link" href="#Next_002dmethod-1"> &para;</a></span></h4>
<p>When you call a generic function, with a particular set of arguments,
GOOPS builds a list of all the methods that are applicable to those
arguments and orders them by how closely the method definitions match
the actual argument types. It then calls the method at the top of this
list. If the selected method&rsquo;s code wants to call on to the next method
in this list, it can do so by using <code class="code">next-method</code>.
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(define-method (Test (a &lt;integer&gt;)) (cons 'integer (next-method)))
(define-method (Test (a &lt;number&gt;)) (cons 'number (next-method)))
(define-method (Test a) (list 'top))
</pre></div>
<p>With these definitions,
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(Test 1) &rArr; (integer number top)
(Test 1.0) &rArr; (number top)
(Test #t) &rArr; (top)
</pre></div>
<p><code class="code">next-method</code> is always called as just <code class="code">(next-method)</code>. The
arguments for the next method call are always implicit, and always the
same as for the original method call.
</p>
<p>If you want to call on to a method with the same name but with a
different set of arguments (as you might with overloaded methods in C++,
for example), you do not use <code class="code">next-method</code>, but instead simply
write the new call as usual:
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(define-method (Test (a &lt;number&gt;) min max)
(if (and (&gt;= a min) (&lt;= a max))
(display &quot;Number is in range\n&quot;))
(Test a))
(Test 2 1 10)
-|
Number is in range
&rArr;
(integer number top)
</pre></div>
<p>(You should be careful in this case that the <code class="code">Test</code> calls do not
lead to an infinite recursion, but this consideration is just the same
as in Scheme code in general.)
</p>
</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="Generic-Function-and-Method-Examples.html">Generic Function and Method Examples</a>, Previous: <a href="Merging-Generics.html">Merging Generics</a>, Up: <a href="Methods-and-Generic-Functions.html">Methods and Generic Functions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>