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

130 lines
5.8 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>Lambda Alternatives (Guile Reference Manual)</title>
<meta name="description" content="Lambda Alternatives (Guile Reference Manual)">
<meta name="keywords" content="Lambda Alternatives (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="About-Procedures.html" rel="up" title="About Procedures">
<link href="Creating-a-Procedure.html" rel="prev" title="Creating a Procedure">
<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="Lambda-Alternatives">
<div class="nav-panel">
<p>
Previous: <a href="Creating-a-Procedure.html" accesskey="p" rel="prev">Creating and Using a New Procedure</a>, Up: <a href="About-Procedures.html" accesskey="u" rel="up">The Representation and Use of Procedures</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="Lambda-Alternatives-1"><span>3.2.4 Lambda Alternatives<a class="copiable-link" href="#Lambda-Alternatives-1"> &para;</a></span></h4>
<p>Since it is so common in Scheme programs to want to create a procedure
and then store it in a variable, there is an alternative form of the
<code class="code">define</code> syntax that allows you to do just that.
</p>
<p>A <code class="code">define</code> expression of the form
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(define (<var class="var">name</var> [<var class="var">arg1</var> [<var class="var">arg2</var> ...]])
<var class="var">body</var> ...)
</pre></div>
<p>is exactly equivalent to the longer form
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(define <var class="var">name</var>
(lambda ([<var class="var">arg1</var> [<var class="var">arg2</var> ...]])
<var class="var">body</var> ...))
</pre></div>
<p>So, for example, the definition of <code class="code">make-combined-string</code> in the
previous subsection could equally be written:
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(define (make-combined-string name address)
(string-append &quot;Name=&quot; name &quot;:Address=&quot; address))
</pre></div>
<p>This kind of procedure definition creates a procedure that requires
exactly the expected number of arguments. There are two further forms
of the <code class="code">lambda</code> expression, which create a procedure that can
accept a variable number of arguments:
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(lambda (<var class="var">arg1</var> ... . <var class="var">args</var>) <var class="var">body</var> ...)
(lambda <var class="var">args</var> <var class="var">body</var> ...)
</pre></div>
<p>The corresponding forms of the alternative <code class="code">define</code> syntax are:
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(define (<var class="var">name</var> <var class="var">arg1</var> ... . <var class="var">args</var>) <var class="var">body</var> ...)
(define (<var class="var">name</var> . <var class="var">args</var>) <var class="var">body</var> ...)
</pre></div>
<p>For details on how these forms work, see See <a class="xref" href="Lambda.html">Lambda: Basic Procedure Creation</a>.
</p>
<p>Prior to Guile 2.0, Guile provided an extension to <code class="code">define</code> syntax
that allowed you to nest the previous extension up to an arbitrary
depth. These are no longer provided by default, and instead have been
moved to <a class="ref" href="Curried-Definitions.html">Curried Definitions</a>.
</p>
<p>(It could be argued that the alternative <code class="code">define</code> forms are rather
confusing, especially for newcomers to the Scheme language, as they hide
both the role of <code class="code">lambda</code> and the fact that procedures are values
that are stored in variables in the same way as any other kind of value.
On the other hand, they are very convenient, and they are also a good
example of another of Scheme&rsquo;s powerful features: the ability to specify
arbitrary syntactic transformations at run time, which can be applied to
subsequently read input.)
</p>
</div>
<hr>
<div class="nav-panel">
<p>
Previous: <a href="Creating-a-Procedure.html">Creating and Using a New Procedure</a>, Up: <a href="About-Procedures.html">The Representation and Use of Procedures</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>