emacs.d/clones/lisp/llthw.common-lisp.dev/1-09-0-closures.html

1918 lines
49 KiB
HTML
Raw Normal View History

2022-08-24 19:36:32 +02:00
<!DOCTYPE HTML>
<html lang="" >
<head>
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>Extra Credit: Closures · Learn Lisp The Hard Way</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="description" content="">
<meta name="generator" content="GitBook 3.2.3">
<meta name="author" content=""the Phoeron" Colin J.E. Lupton">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-hints/plugin-hints.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-folding-chapters/folding-chapters.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="1-10-0-functions.html" />
<link rel="prev" href="1-08-0-variables.html" />
</head>
<body>
<div class="book">
<div class="book-summary">
<div id="book-search-input" role="search">
<input type="text" placeholder="Type to search" />
</div>
<nav role="navigation">
<ul class="summary">
<li class="header">LEARN LISP THE HARD WAY</li>
<li class="chapter " data-level="1.1" data-path="./">
<a href="index.html">
Second Draft (in-progress)
</a>
</li>
<li class="chapter " data-level="1.2" data-path="CHANGELOG.html">
<a href="CHANGELOG.html">
CHANGELOG
</a>
</li>
<li class="chapter " data-level="1.3" data-path="TODO.html">
<a href="TODO.html">
TODO
</a>
</li>
<li class="header">PREFACE</li>
<li class="chapter " data-level="2.1" data-path="preface.html">
<a href="preface.html">
TANSTAAFL
</a>
</li>
<li class="chapter " data-level="2.2" data-path="preface-part-two.html">
<a href="preface-part-two.html">
The Hard Way is Easier
</a>
</li>
<li class="chapter " data-level="2.3" data-path="preface-part-three.html">
<a href="preface-part-three.html">
Who Is This Book For?
</a>
</li>
<li class="chapter " data-level="2.4" data-path="introduction.html">
<a href="introduction.html">
Lisp: A Future History
</a>
</li>
<li class="chapter " data-level="2.5" data-path="acknowledgements.html">
<a href="acknowledgements.html">
Acknowledgements
</a>
</li>
<li class="header">PART ONE</li>
<li class="chapter " data-level="3.1" data-path="1-0-0-overview.html">
<a href="1-0-0-overview.html">
Grokking Lisp
</a>
<ul class="articles">
<li class="chapter " data-level="3.1.1" data-path="1-01-00-lisp-bootcamp.html">
<a href="1-01-00-lisp-bootcamp.html">
Common Lisp Bootcamp
</a>
<ul class="articles">
<li class="chapter " data-level="3.1.1.1" data-path="1-01-01-syntax-overview.html">
<a href="1-01-01-syntax-overview.html">
Syntax Overview in 5 Minutes
</a>
</li>
<li class="chapter " data-level="3.1.1.2" data-path="1-01-02-repl.html">
<a href="1-01-02-repl.html">
The REPL
</a>
</li>
<li class="chapter " data-level="3.1.1.3" data-path="1-01-03-expressions.html">
<a href="1-01-03-expressions.html">
Expressions, Parentheses, and Return Values
</a>
</li>
<li class="chapter " data-level="3.1.1.4" data-path="1-01-04-lists-cons-cells.html">
<a href="1-01-04-lists-cons-cells.html">
Lists, Cons-Cells, and Memory
</a>
</li>
<li class="chapter " data-level="3.1.1.5" data-path="1-01-05-symbols.html">
<a href="1-01-05-symbols.html">
Symbols and Namespaces
</a>
</li>
<li class="chapter " data-level="3.1.1.6" data-path="1-01-06-prefix-notation.html">
<a href="1-01-06-prefix-notation.html">
Prefix Notation
</a>
</li>
<li class="chapter " data-level="3.1.1.7" data-path="1-01-07-style-guide.html">
<a href="1-01-07-style-guide.html">
Common Lisp Style Guide
</a>
</li>
<li class="chapter " data-level="3.1.1.8" data-path="1-01-08-configuration.html">
<a href="1-01-08-configuration.html">
Configuring Your Development Environment
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.1.2" data-path="1-02-00-input-output.html">
<a href="1-02-00-input-output.html">
Printing, Streams, and Strings
</a>
<ul class="articles">
<li class="chapter " data-level="3.1.2.1" data-path="1-02-01-strings.html">
<a href="1-02-01-strings.html">
Strings
</a>
</li>
<li class="chapter " data-level="3.1.2.2" data-path="1-02-02-more-strings.html">
<a href="1-02-02-more-strings.html">
More Strings
</a>
</li>
<li class="chapter " data-level="3.1.2.3" data-path="1-02-03-unicode.html">
<a href="1-02-03-unicode.html">
Unicode and Strings
</a>
</li>
<li class="chapter " data-level="3.1.2.4" data-path="1-02-04-chars.html">
<a href="1-02-04-chars.html">
Characters
</a>
</li>
<li class="chapter " data-level="3.1.2.5" data-path="1-02-05-more-chars.html">
<a href="1-02-05-more-chars.html">
More Characters
</a>
</li>
<li class="chapter " data-level="3.1.2.6" data-path="1-02-06-char-codes.html">
<a href="1-02-06-char-codes.html">
Character Codes
</a>
</li>
<li class="chapter " data-level="3.1.2.7" data-path="1-02-07-strings-from-chars.html">
<a href="1-02-07-strings-from-chars.html">
Strings from Chars
</a>
</li>
<li class="chapter " data-level="3.1.2.8" data-path="1-02-08-printing.html">
<a href="1-02-08-printing.html">
Printing
</a>
</li>
<li class="chapter " data-level="3.1.2.9" data-path="1-02-09-more-printing.html">
<a href="1-02-09-more-printing.html">
More Printing
</a>
</li>
<li class="chapter " data-level="3.1.2.10" data-path="1-02-10-prin1.html">
<a href="1-02-10-prin1.html">
Printing With prin1
</a>
</li>
<li class="chapter " data-level="3.1.2.11" data-path="1-02-11-princ.html">
<a href="1-02-11-princ.html">
Printing With princ
</a>
</li>
<li class="chapter " data-level="3.1.2.12" data-path="1-02-12-format.html">
<a href="1-02-12-format.html">
A Brief Introduction to Format
</a>
</li>
<li class="chapter " data-level="3.1.2.13" data-path="1-02-13-more-format.html">
<a href="1-02-13-more-format.html">
A Little Bit More on Format
</a>
</li>
<li class="chapter " data-level="3.1.2.14" data-path="1-02-14-pathnames.html">
<a href="1-02-14-pathnames.html">
Pathnames
</a>
</li>
<li class="chapter " data-level="3.1.2.15" data-path="1-02-15-streams.html">
<a href="1-02-15-streams.html">
Streams
</a>
</li>
<li class="chapter " data-level="3.1.2.16" data-path="1-02-16-file-streams.html">
<a href="1-02-16-file-streams.html">
File Streams
</a>
</li>
<li class="chapter " data-level="3.1.2.17" data-path="1-02-17-binary-streams.html">
<a href="1-02-17-binary-streams.html">
Binary Streams
</a>
</li>
<li class="chapter " data-level="3.1.2.18" data-path="1-02-18-prompting-users.html">
<a href="1-02-18-prompting-users.html">
Prompting Users
</a>
</li>
<li class="chapter " data-level="3.1.2.19" data-path="1-02-19-pretty-printing.html">
<a href="1-02-19-pretty-printing.html">
Pretty-Printing
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.1.3" data-path="1-03-0-getting-input-from-users.html">
<a href="1-03-0-getting-input-from-users.html">
Extra Credit: Getting Input from Users
</a>
</li>
<li class="chapter " data-level="3.1.4" data-path="1-04-0-lists.html">
<a href="1-04-0-lists.html">
Lists and List-Operations
</a>
</li>
<li class="chapter " data-level="3.1.5" data-path="1-05-0-lookups-trees.html">
<a href="1-05-0-lookups-trees.html">
Extra Credit: Look-up Lists and Trees
</a>
</li>
<li class="chapter " data-level="3.1.6" data-path="1-06-0-math.html">
<a href="1-06-0-math.html">
Numbers and Math
</a>
<ul class="articles">
<li class="chapter " data-level="3.1.6.1" data-path="1-06-01-integers.html">
<a href="1-06-01-integers.html">
Integers
</a>
</li>
<li class="chapter " data-level="3.1.6.2" data-path="1-06-02-more-integers.html">
<a href="1-06-02-more-integers.html">
More Integers
</a>
</li>
<li class="chapter " data-level="3.1.6.3" data-path="1-06-03-hexadecimal-notation.html">
<a href="1-06-03-hexadecimal-notation.html">
Hexadecimal Integer Notation
</a>
</li>
<li class="chapter " data-level="3.1.6.4" data-path="1-06-04-octal-notation.html">
<a href="1-06-04-octal-notation.html">
Octal Integer Notation
</a>
</li>
<li class="chapter " data-level="3.1.6.5" data-path="1-06-05-binary-notation.html">
<a href="1-06-05-binary-notation.html">
Binary Integer Notation
</a>
</li>
<li class="chapter " data-level="3.1.6.6" data-path="1-06-06-ratios.html">
<a href="1-06-06-ratios.html">
Ratios and Rational Numbers
</a>
</li>
<li class="chapter " data-level="3.1.6.7" data-path="1-06-07-floating-point.html">
<a href="1-06-07-floating-point.html">
Floating-point Numbers
</a>
</li>
<li class="chapter " data-level="3.1.6.8" data-path="1-06-08-constants.html">
<a href="1-06-08-constants.html">
Numeric Constants
</a>
</li>
<li class="chapter " data-level="3.1.6.9" data-path="1-06-09-complex-numbers.html">
<a href="1-06-09-complex-numbers.html">
Complex Numbers
</a>
</li>
<li class="chapter " data-level="3.1.6.10" data-path="1-06-10-arithmetic.html">
<a href="1-06-10-arithmetic.html">
Arithmetic
</a>
</li>
<li class="chapter " data-level="3.1.6.11" data-path="1-06-11-more-arithmetic.html">
<a href="1-06-11-more-arithmetic.html">
More Arithmetic
</a>
</li>
<li class="chapter " data-level="3.1.6.12" data-path="1-06-12-even-more-arithmetic.html">
<a href="1-06-12-even-more-arithmetic.html">
Even More Arithmetic
</a>
</li>
<li class="chapter " data-level="3.1.6.13" data-path="1-06-13-exponents.html">
<a href="1-06-13-exponents.html">
Exponents
</a>
</li>
<li class="chapter " data-level="3.1.6.14" data-path="1-06-14-logarithms.html">
<a href="1-06-14-logarithms.html">
Logarithms
</a>
</li>
<li class="chapter " data-level="3.1.6.15" data-path="1-06-15-trigonometry.html">
<a href="1-06-15-trigonometry.html">
Trigonometry
</a>
</li>
<li class="chapter " data-level="3.1.6.16" data-path="1-06-16-psuedorandom-numbers.html">
<a href="1-06-16-psuedorandom-numbers.html">
Pseudo-Random Numbers
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.1.7" data-path="1-07-0-arrays.html">
<a href="1-07-0-arrays.html">
Extra Credit: Arrays and Vectors
</a>
</li>
<li class="chapter " data-level="3.1.8" data-path="1-08-0-variables.html">
<a href="1-08-0-variables.html">
Variables, Parameters, and Constants
</a>
</li>
<li class="chapter active" data-level="3.1.9" data-path="1-09-0-closures.html">
<a href="1-09-0-closures.html">
Extra Credit: Closures
</a>
</li>
<li class="chapter " data-level="3.1.10" data-path="1-10-0-functions.html">
<a href="1-10-0-functions.html">
Functions and Macros
</a>
</li>
<li class="chapter " data-level="3.1.11" data-path="1-11-0-text-adventure.html">
<a href="1-11-0-text-adventure.html">
Extra Credit: A Simple Text Adventure
</a>
</li>
<li class="chapter " data-level="3.1.12" data-path="1-12-0-namespaces.html">
<a href="1-12-0-namespaces.html">
Namespaces, Symbols, Packages, and Systems
</a>
</li>
<li class="chapter " data-level="3.1.13" data-path="1-13-0-simple-web-app.html">
<a href="1-13-0-simple-web-app.html">
Extra Credit: A Simple Web Application
</a>
</li>
<li class="chapter " data-level="3.1.14" data-path="1-14-0-conditionals.html">
<a href="1-14-0-conditionals.html">
Conditionals
</a>
</li>
<li class="chapter " data-level="3.1.15" data-path="1-15-0-command-line-utility.html">
<a href="1-15-0-command-line-utility.html">
Extra Credit: Command-Line Utilities
</a>
</li>
<li class="chapter " data-level="3.1.16" data-path="1-16-0-map-loop.html">
<a href="1-16-0-map-loop.html">
Mapping and Looping
</a>
</li>
<li class="chapter " data-level="3.1.17" data-path="1-17-0-iterate.html">
<a href="1-17-0-iterate.html">
Extra Credit: Revisiting Loops with Iterate
</a>
</li>
<li class="chapter " data-level="3.1.18" data-path="1-18-0-format.html">
<a href="1-18-0-format.html">
Format Strings
</a>
</li>
<li class="chapter " data-level="3.1.19" data-path="1-19-0-dsl.html">
<a href="1-19-0-dsl.html">
Extra Credit: Domain Specific Languages
</a>
</li>
<li class="chapter " data-level="3.1.20" data-path="1-20-0-review.html">
<a href="1-20-0-review.html">
Part One in Review
</a>
</li>
</ul>
</li>
<li class="header">PART TWO</li>
<li class="chapter " data-level="4.1" data-path="2-0-0-overview.html">
<a href="2-0-0-overview.html">
The Suffusion of Blue
</a>
<ul class="articles">
<li class="chapter " data-level="4.1.1" data-path="2-01-0-programming-paradigms.html">
<a href="2-01-0-programming-paradigms.html">
Programming Paradigms
</a>
</li>
<li class="chapter " data-level="4.1.2" data-path="2-02-0-regex.html">
<a href="2-02-0-regex.html">
Extra Credit: Regular Expressions
</a>
</li>
<li class="chapter " data-level="4.1.3" data-path="2-03-0-objects-control.html">
<a href="2-03-0-objects-control.html">
Objects and Control Structures
</a>
</li>
<li class="chapter " data-level="4.1.4" data-path="2-04-0-data-persistence.html">
<a href="2-04-0-data-persistence.html">
Extra Credit: Persistence and Databases
</a>
</li>
<li class="chapter " data-level="4.1.5" data-path="2-05-0-extended-types.html">
<a href="2-05-0-extended-types.html">
Extended Types
</a>
</li>
<li class="chapter " data-level="4.1.6" data-path="2-06-0-threads-memos-parallel.html">
<a href="2-06-0-threads-memos-parallel.html">
Extra Credit: Concurrency and Memoization
</a>
</li>
<li class="chapter " data-level="4.1.7" data-path="2-07-0-logic-and-more-math.html">
<a href="2-07-0-logic-and-more-math.html">
Logic and Advanced Math
</a>
</li>
<li class="chapter " data-level="4.1.8" data-path="2-08-0-number-theory.html">
<a href="2-08-0-number-theory.html">
Extra Credit: Number Theory
</a>
</li>
<li class="chapter " data-level="4.1.9" data-path="2-09-0-binary-octets-bits.html">
<a href="2-09-0-binary-octets-bits.html">
Binary Streams, Octet-Vectors, and Bit-Vectors
</a>
</li>
<li class="chapter " data-level="4.1.10" data-path="2-10-0-improved-text-adventure-engine.html">
<a href="2-10-0-improved-text-adventure-engine.html">
Extra Credit: An Improved Text Adventure Engine
</a>
</li>
<li class="chapter " data-level="4.1.11" data-path="2-11-0-conditions.html">
<a href="2-11-0-conditions.html">
Conditions and Error Handling
</a>
</li>
<li class="chapter " data-level="4.1.12" data-path="2-12-0-2d-game.html">
<a href="2-12-0-2d-game.html">
Extra Credit: Write a 2D Game
</a>
</li>
<li class="chapter " data-level="4.1.13" data-path="2-13-0-compiler.html">
<a href="2-13-0-compiler.html">
The Compiler
</a>
</li>
<li class="chapter " data-level="4.1.14" data-path="2-14-0-tree-shaker.html">
<a href="2-14-0-tree-shaker.html">
Extra Credit: Write a Tree-Shaker
</a>
</li>
<li class="chapter " data-level="4.1.15" data-path="2-15-0-docs-and-inspection.html">
<a href="2-15-0-docs-and-inspection.html">
Documentation and Inspection
</a>
</li>
<li class="chapter " data-level="4.1.16" data-path="2-16-0-foreign-libs.html">
<a href="2-16-0-foreign-libs.html">
Extra Credit: Foreign Libraries in Lisp
</a>
</li>
<li class="chapter " data-level="4.1.17" data-path="2-17-0-debugging-testing.html">
<a href="2-17-0-debugging-testing.html">
Debugging and Unit Testing
</a>
</li>
<li class="chapter " data-level="4.1.18" data-path="2-18-0-ffi.html">
<a href="2-18-0-ffi.html">
Extra Credit: Write a Foreign Function Interface
</a>
</li>
<li class="chapter " data-level="4.1.19" data-path="2-19-0-essential-libs.html">
<a href="2-19-0-essential-libs.html">
Essential Lisp Libraries
</a>
</li>
<li class="chapter " data-level="4.1.20" data-path="2-20-0-packaging-libs.html">
<a href="2-20-0-packaging-libs.html">
Extra Credit: Packaging Lisp Libraries
</a>
</li>
<li class="chapter " data-level="4.1.21" data-path="2-21-0-review.html">
<a href="2-21-0-review.html">
Detailed Syntax Review
</a>
</li>
</ul>
</li>
<li class="header">PART THREE</li>
<li class="chapter " data-level="5.1" data-path="3-00-00-overview.html">
<a href="3-00-00-overview.html">
Lisp So(u)rcery
</a>
<ul class="articles">
<li class="chapter " data-level="5.1.1" data-path="3-01-00-web-apps.html">
<a href="3-01-00-web-apps.html">
Real-world Web Apps
</a>
</li>
<li class="chapter " data-level="5.1.2" data-path="3-02-00-typesetting.html">
<a href="3-02-00-typesetting.html">
Typesetting
</a>
</li>
<li class="chapter " data-level="5.1.3" data-path="3-03-00-mobile.html">
<a href="3-03-00-mobile.html">
Native Mobile Applications
</a>
</li>
<li class="chapter " data-level="5.1.4" data-path="3-04-00-gui.html">
<a href="3-04-00-gui.html">
Cross-platform Desktop Applications
</a>
</li>
<li class="chapter " data-level="5.1.5" data-path="3-05-00-system-utils.html">
<a href="3-05-00-system-utils.html">
Drivers, Daemons, and System-Utilities
</a>
</li>
<li class="chapter " data-level="5.1.6" data-path="3-06-00-reverse-engineering.html">
<a href="3-06-00-reverse-engineering.html">
Reverse Engineering
</a>
</li>
<li class="chapter " data-level="5.1.7" data-path="3-07-00-graphics.html">
<a href="3-07-00-graphics.html">
Graphics Rendering
</a>
</li>
<li class="chapter " data-level="5.1.8" data-path="3-08-00-gaming.html">
<a href="3-08-00-gaming.html">
OpenGL, SDL, and 3D Game Development
</a>
</li>
<li class="chapter " data-level="5.1.9" data-path="3-09-00-audio.html">
<a href="3-09-00-audio.html">
Audio Generation and Manipulation
</a>
</li>
<li class="chapter " data-level="5.1.10" data-path="3-10-00-data.html">
<a href="3-10-00-data.html">
Data Aggregation and Analysis
</a>
</li>
<li class="chapter " data-level="5.1.11" data-path="3-11-00-cryptosec.html">
<a href="3-11-00-cryptosec.html">
Cryptography and Security
</a>
</li>
<li class="chapter " data-level="5.1.12" data-path="3-12-00-fintech.html">
<a href="3-12-00-fintech.html">
Financial Software and Crypto-Currencies
</a>
</li>
<li class="chapter " data-level="5.1.13" data-path="3-13-00-scientific-computing.html">
<a href="3-13-00-scientific-computing.html">
Scientific Computing
</a>
</li>
<li class="chapter " data-level="5.1.14" data-path="3-14-00-computational-physics.html">
<a href="3-14-00-computational-physics.html">
Computational Physics
</a>
</li>
<li class="chapter " data-level="5.1.15" data-path="3-15-00-quantum-computing.html">
<a href="3-15-00-quantum-computing.html">
Quantum Computing
</a>
</li>
<li class="chapter " data-level="5.1.16" data-path="3-16-00-nlp.html">
<a href="3-16-00-nlp.html">
Natural Language Processing
</a>
</li>
<li class="chapter " data-level="5.1.17" data-path="3-17-00-ai.html">
<a href="3-17-00-ai.html">
Artificial Intelligence
</a>
</li>
<li class="chapter " data-level="5.1.18" data-path="3-18-00-robotics.html">
<a href="3-18-00-robotics.html">
Robotics
</a>
</li>
<li class="chapter " data-level="5.1.19" data-path="3-19-00-space-tech.html">
<a href="3-19-00-space-tech.html">
Space Tech
</a>
</li>
<li class="chapter " data-level="5.1.20" data-path="3-20-00-neurotech.html">
<a href="3-20-00-neurotech.html">
Neuroscience and Thought-Controlled Computing
</a>
</li>
<li class="chapter " data-level="5.1.21" data-path="3-21-00-lispos.html">
<a href="3-21-00-lispos.html">
A Simple LispOS
</a>
</li>
<li class="chapter " data-level="5.1.22" data-path="3-22-00-lisp-machine.html">
<a href="3-22-00-lisp-machine.html">
Build Your Own Lisp Machine
</a>
</li>
<li class="chapter " data-level="5.1.23" data-path="3-23-00-gov-mil.html">
<a href="3-23-00-gov-mil.html">
Government and Military Grade Systems
</a>
</li>
</ul>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="index.html" >Extra Credit: Closures</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<div id="book-search-results">
<div class="search-noresults">
<section class="normal markdown-section">
<h1 id="chapter-19-----extra-credit">Chapter 1.9 --- Extra Credit</h1>
<h2 id="closures">Closures</h2>
<blockquote>
<p>&quot;Everything is theoretically impossible, until it is done.&quot;</p>
<footer>Robert A. Heinlein, <em>The Rolling Stones</em></footer>
</blockquote>
<p>One of the neater features of Lisp that result from lexical scope are <em>Closures</em>---you may have even heard of them before, since &quot;closure&quot; has been a big buzz-word in the tech world lately---particularly in the Node.js community. In the jargon of Computer Science, a Closure is a lambda expression (or, anonymous function), which has its open bindings bound in the lexical environment where it was defined. For now, you can think of them as a means to preserve state in functional programming.</p>
<p>Closures were first developed to manually evaluate expressions in Lambda Calculus, and included as a language feature in the first version of Scheme. The feature was added to Common Lisp during the ANSI standardization process, and nowadays can be found in all Lisp-family languages. Naturally, they are also fully supported in Erlang and Haskell. This feature has become so popular in recent years that it has been adopted and shimmied into many other programming and scripting languages, including C++11, Java 8, JavaScript, EcmaScript, Smalltalk, ML, Ruby, Perl, Objective-C (and the Apple extensions to C and C++), C#, D, Swift, and to a limited extent, Python---although the S-Expression syntax of Lisp-family languages makes Closures far more natural to express than with the syntaxes of other languages.</p>
<p>In this chapter we will further explore the concepts of dynamic and lexical scope, introduce the concept of first-class functions, and walk through a number of interesting examples of Closures to make sure you have a good understanding of their use and potential. You&apos;ll also get a sneak peak at functions, giving you more confidence in the material before you tackle the next chapter!</p>
<h3 id="exercise-191">Exercise 1.9.1</h3>
<p><strong>Lexical Environments and Scope</strong></p>
<pre><code class="lang-lisp"><span class="hljs-comment">;; let&apos;s look at lexical scoping</span>
(<span class="hljs-name">let</span> ((<span class="hljs-name">one</span> <span class="hljs-number">1</span>))
(<span class="hljs-name">let</span> ((<span class="hljs-name">two</span> (<span class="hljs-name">+</span> one one)))
(<span class="hljs-name">let</span> ((<span class="hljs-name">three</span> (<span class="hljs-name">+</span> one two)))
(<span class="hljs-name">let</span> ((<span class="hljs-name">one</span> <span class="hljs-number">1.0</span>))
(<span class="hljs-name">+</span> one two three)))))
<span class="hljs-number">6.0</span>
</code></pre>
<h3 id="exercise-192">Exercise 1.9.2</h3>
<p><strong>LET Revisited</strong></p>
<pre><code class="lang-lisp">(<span class="hljs-name">let</span> ((<span class="hljs-name">one</span> <span class="hljs-number">1</span>)
(<span class="hljs-name">two</span> <span class="hljs-number">2</span>)
(<span class="hljs-name">three</span> <span class="hljs-number">3</span>))
(<span class="hljs-name">-</span> three two one))
</code></pre>
<h3 id="exercise-193">Exercise 1.9.3</h3>
<p><strong>LET*: Nested Lexical Scope</strong></p>
<pre><code class="lang-lisp">(<span class="hljs-name">let*</span> ((<span class="hljs-name">one</span> <span class="hljs-number">1</span>)
(<span class="hljs-name">two</span> (<span class="hljs-name">+</span> one one))
(<span class="hljs-name">three</span> (<span class="hljs-name">+</span> two one)))
(<span class="hljs-name">*</span> three three))
</code></pre>
<h3 id="exercise-194">Exercise 1.9.4</h3>
<p><strong>Pure Functions</strong></p>
<ul>
<li>No side-effects</li>
<li>No reliance on external state</li>
<li>Same input =&gt; same output, every time</li>
</ul>
<pre><code class="lang-lisp">
</code></pre>
<h3 id="exercise-195">Exercise 1.9.5</h3>
<p><strong>First-Class Functions</strong></p>
<p>Functions can be passed as an argument to another function.</p>
<pre><code class="lang-lisp">(<span class="hljs-name">map</span> &apos;vector #&apos;+ &apos;(<span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-number">3</span> <span class="hljs-number">4</span>) &apos;(<span class="hljs-number">10</span> <span class="hljs-number">20</span> <span class="hljs-number">30</span> <span class="hljs-number">40</span>))
</code></pre>
<h3 id="exercise-196">Exercise 1.9.6</h3>
<p><strong>Functors: Function Objects</strong></p>
<pre><code class="lang-lisp">
</code></pre>
<h3 id="exercise-197">Exercise 1.9.7</h3>
<p><strong>LABEL and BLOCK</strong></p>
<pre><code class="lang-lisp">
</code></pre>
<h3 id="exercise-198">Exercise 1.9.8</h3>
<p><strong>Functions as Arguments</strong></p>
<pre><code class="lang-lisp">
</code></pre>
<h3 id="exercise-199">Exercise 1.9.9</h3>
<p><strong>Your First Closure</strong></p>
<pre><code class="lang-lisp">
</code></pre>
<h3 id="exercise-1910">Exercise 1.9.10</h3>
<p><strong>Dancing Closures</strong></p>
<pre><code class="lang-lisp">
</code></pre>
<h3 id="exercise-1911">Exercise 1.9.11</h3>
<p><strong>The Macroexpansion of DEFUN</strong></p>
<pre><code class="lang-lisp">
</code></pre>
<h3 id="exercise-1912">Exercise 1.9.12</h3>
<p><strong>Extending Closures: Continuations</strong></p>
<pre><code class="lang-lisp">
</code></pre>
<h3 id="exercise-1913">Exercise 1.9.13</h3>
<p><strong>Extending Closures: Partials</strong></p>
<pre><code class="lang-lisp">
</code></pre>
</section>
</div>
<div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
</div>
</div>
</div>
<a href="1-08-0-variables.html" class="navigation navigation-prev " aria-label="Previous page: Variables, Parameters, and Constants">
<i class="fa fa-angle-left"></i>
</a>
<a href="1-10-0-functions.html" class="navigation navigation-next " aria-label="Next page: Functions and Macros">
<i class="fa fa-angle-right"></i>
</a>
</div>
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"Extra Credit: Closures","level":"3.1.9","depth":2,"next":{"title":"Functions and Macros","level":"3.1.10","depth":2,"path":"1-10-0-functions.md","ref":"./1-10-0-functions.md","articles":[]},"previous":{"title":"Variables, Parameters, and Constants","level":"3.1.8","depth":2,"path":"1-08-0-variables.md","ref":"./1-08-0-variables.md","articles":[]},"dir":"ltr"},"config":{"plugins":["hints","folding-chapters"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"hints":{"danger":"fa fa-exclamation-circle","info":"fa fa-info-circle","tip":"fa fa-mortar-board","working":"fa fa-wrench"},"folding-chapters":{},"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"\"the Phoeron\" Colin J.E. Lupton","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"index.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"Learn Lisp The Hard Way","gitbook":"*"},"file":{"path":"1-09-0-closures.md","mtime":"2022-08-22T22:47:49.767Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2022-08-24T16:15:01.957Z"},"basePath":".","book":{"language":""}});
});
</script>
</div>
<script src="gitbook/gitbook.js"></script>
<script src="gitbook/theme.js"></script>
<script src="gitbook/gitbook-plugin-folding-chapters/folding-chapters.js"></script>
<script src="gitbook/gitbook-plugin-search/search-engine.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
</body>
</html>